clickhouse 中SUM(CASE WHEN ...) 返回什么类型?
文章目录
- 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