当 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 会生成一个空数组?的主要内容,如果未能解决你的问题,请参考以下文章

当玩家节点与另一个节点碰撞时游戏结束,当玩家与边界碰撞时游戏才应该结束

当玩家与其他 SKSpriteNode 碰撞时摆脱“反弹”

当堆栈视图调整大小时,如何让 NSButton 与 NSStackView 分离?

Spring - 当列名与模型中的名称不同时,本机查询与休眠混合

当类别名称与数据混合时如何提取组类别

当敌人与 Player-Unity 碰撞时加载场景