当 ARRAY_CONCAT 与 ARRAY_AGG 一起应用于非空数组时,为啥 BigQuery 会生成一个空数组?
Posted
技术标签:
【中文标题】当 ARRAY_CONCAT 与 ARRAY_AGG 一起应用于非空数组时,为啥 BigQuery 会生成一个空数组?【英文标题】:Why BigQuery produces an empty array when ARRAY_CONCAT is applied on a non empty array in conjunction with ARRAY_AGG?当 ARRAY_CONCAT 与 ARRAY_AGG 一起应用于非空数组时,为什么 BigQuery 会生成一个空数组? 【发布时间】:2020-05-19 19:04:47 【问题描述】:我在 BigQuery 中遇到了一个非常奇怪的行为。
以下查询产生了意外的结果空数组[]
,因为我正在连接数组,所以我期待一个包含我要连接的所有元素的数组。
SELECT ARRAY_CONCAT(
(
SELECT ARRAY_AGG(col1) -- This is creating an empty array since condition is always false
FROM ...
WHERE 1 = 2
),
['test']
)
虽然一个非常相似的查询会产生预期的结果['test']
:
SELECT ARRAY_CONCAT(
[],
['test']
)
ARRAY_AGG() 确实产生了一个空数组[]
:
SELECT ARRAY_AGG(col1) -- This is creating an empty array since condition is always false
FROM ...
WHERE 1 = 2
为什么第一个查询产生一个空数组,而它是第二个和第三个查询的组合?
【问题讨论】:
【参考方案1】:这有点难以解释。您的第一个查询不会产生 空数组。它产生一个数组列,其值为NULL
。这就是 concat 返回 NULL
的原因。
作为一般规则,几乎没有行的子查询中的聚合函数返回NULL
。唯一的例外是COUNT()
,它返回0
。
很容易认为NULL
和一个空数组是一回事。他们不是。
【讨论】:
以上是关于当 ARRAY_CONCAT 与 ARRAY_AGG 一起应用于非空数组时,为啥 BigQuery 会生成一个空数组?的主要内容,如果未能解决你的问题,请参考以下文章
当玩家节点与另一个节点碰撞时游戏结束,当玩家与边界碰撞时游戏才应该结束
当堆栈视图调整大小时,如何让 NSButton 与 NSStackView 分离?