PostgreSQL中sum case when关联查询无匹配时如何返回0
结论
完全可以通过单条SQL实现,无需编写两条独立SQL。
问题原因
你当前使用的逗号分隔的表关联是隐式内连接,仅会返回t1和t2中a字段匹配的记录,t1中不存在t2匹配项的记录会被直接过滤。
修改方案
将内连接替换为左外连接(LEFT JOIN),把表关联条件放到ON子句中即可,修改后的SQL如下:
SELECT t1.a, t1.b, t1.c, COALESCE(sum(case when t2.d > 0 then 1 else 0 end), 0) as d FROM t1 LEFT JOIN t2 ON t1.a = t2.a WHERE t1.e = '123' GROUP BY t1.a, t1.b, t1.c ORDER BY a ASC;
这里额外加COALESCE函数是为了兼容部分数据库中全NULL值sum运算返回NULL的情况,确保无匹配记录时d字段固定返回0。
结果验证
针对你给出的示例数据,上述SQL执行后会完全匹配期望结果,包含a=4的记录且d字段值为0。
内容的提问来源于stack exchange,提问作者Kukula Mula
相关产品推荐
相关产品推荐

