文章目錄
- clickhouse 中SUM(CASE WHEN ...) 返回什么類型?
- CASE WHEN`
- SUM(CASE WHEN ...) 返回什么類型?
clickhouse 中SUM(CASE WHEN …) 返回什么類型?
CASE WHEN`
ClickHouse
中的CASE WHEN
用法與SQL
標準中的用法基本相同,用于實現條件分支邏輯
SELECT *,CASEWHEN grade >= 90 THEN 'A'WHEN grade >= 80 THEN 'B'WHEN grade >= 70 THEN 'C'ELSE 'D'END AS grade_level
FROM student_scores
- 在上述代碼中,我們使用了一個不帶參數的
CASE WHEN
語句來根據成績返回對應的等級。 - 在
ClickHouse
中,CASE WHEN
語句也可以嵌套使用,可以根據實際需求編寫更為復雜的條件分支邏輯。
SUM(CASE WHEN …) 返回什么類型?
ClickHouse 在進行 SUM(CASE WHEN …) 計算時,默認使用最小的整數類型來存儲結果。
ClickHouse 支持所有標準SQL 聚合函數(sum, avg, min, max, count),以及一系列其他聚合函數。
ClickHouse 進行 SUM(CASE WHEN ...)
時返回的類型是不確定性的,它會計算所有符合條件的數值并將它們累加起來,返回該數值的總和,如果所有條件都不符合,則返回 0。
-- 場景1:少量數據,小范圍
SELECT SUM(CASE WHEN id < 10 THEN 1 ELSE 0 END) -- 可能是 UInt8-- 場景2:大量數據
SELECT SUM(CASE WHEN id < 1000000 THEN 1 ELSE 0 END) -- 可能是 UInt32 或 UInt64
如果 SUM(CASE WHEN …) 的結果可能超過 uint8 的范圍(0-255),處理方式:
直接使用更大的整數類型,顯式轉換方案
-- 方案1: 顯式轉換
toUInt64(SUM(CASE WHEN condition THEN 1 ELSE 0 END))-- 方案2: 強制類型提升
SUM(CASE WHEN condition THEN 1 ELSE 0 END) * 1
Go 中的安全處理:
type Result struct {Count uint64 `json:"count"` // 使用 uint64 避免溢出
}// 查詢使用 toUInt64 轉換
sql := `SELECT toUInt64(SUM(CASE WHEN condition THEN 1 ELSE 0 END)) as countFROM your_table
`
雖然可以用go interface{} 接受,然后判斷類型,去轉換,但是個人喜歡:
- ck使用
toUInt64()
- Go 結構體使用
uint64