DB2查询无记录或计数为0时返回‘0’的实现求助
解决DB2查询无匹配行时返回0的问题
我完全懂你遇到的糟心事——当cust=123在table1里找不到匹配行时,你的查询直接返回空结果,而不是你想要的cust=123、Range='PRIOR'、count=0这一行。之前用coalesce或者IFNULL没生效,核心原因是WHERE条件把所有行都过滤掉后,聚合查询根本没法生成你需要的固定行结构。
问题出在哪?
先看你的原查询:
select cust, 'PRIOR' as Range, coalesce(count(case when fordate between '2017-01-01' and '2017-04-13' then 1 else 0 end),0)as count from table1 where cust = 123
当cust=123在表中不存在时,WHERE子句直接排除了所有行,聚合函数count没有数据可计算,最终返回的是空结果集,而不是带着0的行。
可行的解决方案:用固定行左连接
我们可以先构造一个包含目标cust和Range的固定行,再左连接到聚合查询的结果上,这样哪怕没有匹配数据,也能保留固定行并把count设为0:
WITH target_cust AS ( SELECT 123 AS cust, 'PRIOR' AS Range FROM SYSIBM.SYSDUMMY1 ) SELECT tc.cust, tc.Range, COALESCE(t.count, 0) AS count FROM target_cust tc LEFT JOIN ( SELECT cust, COUNT(CASE WHEN fordate BETWEEN '2017-01-01' AND '2017-04-13' THEN 1 END) AS count FROM table1 WHERE cust = 123 GROUP BY cust ) t ON tc.cust = t.cust;
为啥这招管用?
SYSIBM.SYSDUMMY1是DB2自带的虚表,专门用来生成单行数据,我们用它创建了包含目标cust和Range的固定行。- 左连接(
LEFT JOIN)会死死保留target_cust里的行,哪怕右侧的聚合查询没有匹配结果。 COALESCE(t.count, 0)确保当右侧没数据时,count显示为0而不是NULL。
另外提一句,你原查询里的count(case ... else 0 end)其实可以简化成count(case ... end)——因为count会自动忽略NULL值,case不满足条件时默认返回NULL,这样统计的就是符合条件的行数,效果和你原来的写法一致但更简洁。
内容的提问来源于stack exchange,提问作者Geoff_S
相关产品推荐
相关产品推荐

