SQL重复值校验无重复记录时返回0替代null的实现问题
解决方案
问题根源
当前的子查询仅在存在重复ID时返回数据,无重复场景下子查询返回空集合,外层SUM聚合空集合时默认返回NULL。之前将ISNULL放在内层查询的位置不生效,是因为内层无匹配行时根本没有数据行可供计算。
修复后完整代码
SELECT CAST('DQR_ID_HERE' AS VARCHAR(255)) AS DQR_ID, CAST('DB_NAME_HERE' AS VARCHAR(255)) AS DB_NAME, CAST('ID' AS VARCHAR(255)) AS COLUMN_TO_DUPE_CHECK, ISNULL(SUM(DEFECT.DEFECT_COUNT), 0) AS DEFECT_COUNT FROM ( SELECT ID, COUNT(ID) AS DEFECT_COUNT FROM DB_NAME_HERE GROUP BY ID HAVING COUNT(ID) > 1 ) AS DEFECT
修改说明
- 修复原SQL语法错误:原代码每个
CAST表达式多写了1个多余的右括号,同时补充了SELECT子句列之间缺失的逗号 - 核心逻辑修改:在外层SUM聚合函数外嵌套ISNULL,当SUM返回NULL时直接替换为0。外层聚合查询没有GROUP BY子句,即使FROM子句的子查询为空,也会正常返回一行结果,固定的DQR_ID、DB_NAME、COLUMN_TO_DUPE_CHECK字段值不会丢失。
替代方案
如果你的SQL环境适配COALESCE函数,也可以将对应行替换为COALESCE(SUM(DEFECT.DEFECT_COUNT), 0),功能完全一致,COALESCE兼容性更强,支持设置多个备选返回值。
内容的提问来源于stack exchange,提问作者Supernova
相关产品推荐
相关产品推荐

