使用ARRAY_AGG处理NULL数组时,如何获取空结果集?
解决ARRAY_AGG返回NULL行而非空结果集的问题
问题原因
所有聚合函数(包括ARRAY_AGG)的标准行为是:当没有任何行参与聚合时,会返回一行NULL值,而不是空结果集。你的test表是空表,或者所有查询的过滤条件都没匹配到任何行,所以不管怎么组合WHERE/FILTER,ARRAY_AGG都会输出一行NULL。
解决方法
在聚合查询后添加HAVING COUNT(*) > 0子句,只有当存在至少一行参与聚合时,才返回结果。这样没有匹配行时,就会返回0行的空结果集。
修改后的查询示例:
原查询:
SELECT ARRAY_AGG(arr) FROM test;
修改后:SELECT ARRAY_AGG(arr) FROM test HAVING COUNT(*) > 0;原查询:
SELECT ARRAY_AGG(arr) FROM test WHERE arr IS NOT NULL;
修改后:SELECT ARRAY_AGG(arr) FROM test WHERE arr IS NOT NULL HAVING COUNT(*) > 0;原查询:
SELECT ARRAY_AGG(arr) FILTER (WHERE arr IS NOT NULL) FROM test;
修改后:SELECT ARRAY_AGG(arr) FILTER (WHERE arr IS NOT NULL) FROM test HAVING COUNT(arr) > 0; -- 用COUNT(arr)更准确,仅统计非NULL的arr行
原理说明
HAVING子句在聚合操作完成后对结果集过滤:
- 当有行参与聚合时,
COUNT(*) > 0为真,返回聚合结果; - 当没有行参与聚合时,
COUNT(*) > 0为假,整个查询返回空结果集,不会输出那行NULL。
内容的提问来源于stack exchange,提问作者Marc Grue
相关产品推荐
相关产品推荐

