如何从ARRAY中排除NULL,以便查询不会失败

时间:2017-03-03 16:55:01

标签: google-bigquery

ARRAY_AGG聚合函数在其构建的数组中包含NULLs。当此类数组是查询结果的一部分时,查询将失败并显示错误:

  

数组不能有null元素;写作领域的错误

即。以下查询演示了它:

#standardSQL
SELECT ARRAY_AGG(x) FROM UNNEST([1,NULL,2,3]) x

我们如何解决?

3 个答案:

答案 0 :(得分:13)

很高兴你问! BigQuery支持某些聚合函数中的IGNORE NULLSRESPECT 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