You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery中NULL数组写入表后转为空数组是否为预期行为?

BigQuery中CTE与临时表的COALESCE行为差异问题

执行以下CTE查询时,得到预期结果[7]:

WITH Items AS (
  SELECT [] AS num1, CAST(NULL AS ARRAY<INTEGER>) as num2
)
SELECT COALESCE(num2, [7]) FROM Items;

但将Items保存为临时表后,执行相同逻辑的查询得到的却是[],且通过WHERE子句确认该结果并非NULL:

CREATE TEMP TABLE Items
AS
(
  SELECT [] AS num1, CAST(NULL AS ARRAY<INTEGER>) as num2
);

WITH t as
(
  SELECT COALESCE(num2, [7]) as test FROM Items
)
SELECT *
FROM t
WHERE array_length(test)=0

根据BigQuery官方文档说明,空数组与NULL数组是不同的,请问此现象是否为预期行为?


解答

这是预期行为,核心原因是BigQuery在临时表存储中对数组类型NULL值的特殊处理逻辑:

  • 在CTE场景中,CAST(NULL AS ARRAY<INTEGER>)定义的是真正的数组类型NULL值,COALESCE会识别该值为NULL,因此触发替换逻辑返回备选值[7]。
  • 但创建临时表时,BigQuery不会存储数组类型的NULL值,而是自动将其转换为空数组[]。当你从临时表读取num2时,它已经是一个空数组而非NULL,此时COALESCE不会执行替换(因为空数组不属于NULL范畴),最终返回空数组[]。

你可以通过以下查询直接验证临时表中num2的实际值:

SELECT num2, num2 IS NULL, num2 = [] FROM Items;

执行结果会显示num2 IS NULL为false,num2 = []为true,证明临时表中的num2已被转换为空数组。


内容的提问来源于stack exchange,提问作者Dominik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:54:27