ARRAY_AGG聚合函数在其构建的数组中包含NULLs
。当此类数组是查询结果的一部分时,查询将失败并显示错误:
数组不能有null元素;写作领域的错误
即。以下查询演示了它:
#standardSQL
SELECT ARRAY_AGG(x) FROM UNNEST([1,NULL,2,3]) x
我们如何解决?
答案 0 :(得分:13)
IGNORE NULLS
和RESPECT NULLS
修饰符,包括ARRAY_AGG
,因此您的查询将变为
#standardSQL
SELECT ARRAY_AGG(x IGNORE NULLS) FROM UNNEST([1,NULL,2,3]) x
并通过生成[1,2,3]
。更多详情请见documentation。
答案 1 :(得分:3)
另一个有趣的用例是,如果你不想丢失那些NULL元素,而是想用一些默认值替换它。例如-999
下面会这样做
#standardSQL
SELECT ARRAY_AGG(IFNULL(x,-999)) FROM UNNEST([1,NULL,2,3]) x
如果你只想要不同的元素 -
#standardSQL
SELECT ARRAY_AGG(DISTINCT IFNULL(x,-999)) FROM UNNEST([1,NULL,2,3,1,NULL]) x
答案 2 :(得分:1)
补充@Mikhail Berlyant的答案,有时您想以某种方式保留NULL值,但不能使用占位符。例如,如果要使用带有NULL的布尔数组,则不能用NULL代替true
/ false
。
一个不错的解决方法是将值包装在STRUCT中,然后构造数组:
#standardSQL
SELECT ARRAY_AGG(STRUCT(x)) AS struct_array FROM UNNEST([1,NULL,2,3]) x