Presto SQL:存储为VARCHAR的含空串整数列求和问题
解决方案
核心问题分析
你之前的语句sum(coalesce(nullif(c1,''),0)) as c失效的原因是:NULLIF(c1, '')返回的是VARCHAR类型,而0是整数类型,COALESCE要求所有参数的类型必须一致,类型不匹配导致执行失败。
可行的解决方法
方法1:先转换类型再处理空值
先把处理掉空字符串的结果转换为整数,再用COALESCE将NULL替换为0,最后求和:
SUM(COALESCE(CAST(NULLIF(c1, '') AS UNSIGNED), 0)) AS c
NULLIF(c1, ''):将空字符串转为NULL,非空字符串保持原样CAST(...) AS UNSIGNED:把处理后的字符串转为无符号整数(如果需要支持负数,可替换为SIGNED)COALESCE(..., 0):把转换失败或NULL的情况替换为0SUM():对最终的整数值求和
方法2:用CASE语句直观处理分支
如果觉得嵌套函数可读性差,可以用CASE分支明确处理各种情况:
SUM( CASE WHEN c1 = '' OR c1 IS NULL THEN 0 ELSE CAST(c1 AS UNSIGNED) END ) AS c
方法3:兼容非数字字符串场景
如果列中除了空字符串,还有其他非数字内容(比如'abc'),可以用数据库的安全转换函数避免报错:
- MySQL 8.0+/MariaDB:使用
TRY_CAST,转换失败时返回NULLSUM(COALESCE(TRY_CAST(NULLIF(c1, '') AS UNSIGNED), 0)) AS c - SQL Server:同样支持
TRY_CAST函数 - PostgreSQL:使用
TRY_TO_NUMBER指定格式SUM(COALESCE(TRY_TO_NUMBER(NULLIF(c1, ''), '999999'), 0)) AS c
内容的提问来源于stack exchange,提问作者uhmosdhsjxpbcrstis
相关产品推荐
相关产品推荐

