Google bigquery 如何从数组中排除空值,以便查询不会失败

Google bigquery 如何从数组中排除空值,以便查询不会失败,google-bigquery,Google Bigquery,聚合函数在其生成的数组中包含空值。当这些数组是查询结果的一部分时,查询失败并出现错误: 数组不能有空元素;写入字段错误 i、 e.以下查询说明了这一点: #standardSQL SELECT ARRAY_AGG(x) FROM UNNEST([1,NULL,2,3]) x 我们怎样才能解决这个问题呢?很高兴你这么问!BigQuery在一些聚合函数(包括ARRAY_AGG)中支持忽略null和尊重null修饰符,因此您的查询 #standardSQL SELECT ARRAY_AGG(x IG

聚合函数在其生成的数组中包含空值。当这些数组是查询结果的一部分时,查询失败并出现错误:

数组不能有空元素;写入字段错误

i、 e.以下查询说明了这一点:

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

我们怎样才能解决这个问题呢?

很高兴你这么问!BigQuery在一些聚合函数(包括ARRAY_AGG)中支持忽略null和尊重null修饰符,因此您的查询

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

它通过了[1,2,3]。更多细节请参见。

另一个有趣的用例是,如果您不想丢失空元素,而是想用一些默认值替换它。例如-999

下面就可以了

标准SQL 从UNNEST[1,NULL,2,3]x中选择ARRAY_AGGIFNULLx,-999 如果您只需要不同的元素-

标准SQL 从UNNEST[1,NULL,2,3,1,NULL]x中选择数组\u-IFNULLx,-999
作为对@Mikhail Berlyant答案的补充,有时您希望以某种方式保留空值,但不能使用占位符。例如,如果您想要一个带有NULL的布尔数组,则不能用NULL替换true/false

一个很好的解决方法是将值包装到结构中,然后构造数组:

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

为什么我没在报纸上看到这个?我想这就是BigQuery团队发布新功能的地方。它在发行说明中做了说明,但它们还没有发布。为什么ARRAY_AGG可以工作并为某些查询显示null,但对于其他查询,它说ARRAY不能有null元素;写入字段x时出错?数组在查询内部传递时可能有空值,但查询最终结果中写入表的数组有不允许空元素的限制。正是我所寻找的,它可以完美地处理子查询。谢谢,米哈伊尔