【问题标题】:Google BigQuery, I lost null row when using 'unnest' functionGoogle BigQuery,我在使用“unnest”功能时丢失了空行
【发布时间】:2017-12-08 15:25:59
【问题描述】:
#StandardSQL
WITH tableA AS (
SELECT ["T001", "T002", "T003"] AS T_id, [1, 5] AS L_id
UNION ALL
SELECT ["T008", "T009"] AS T_id, NULL AS L_id
)

SELECT * FROM tableA, UNNEST(L_id) AS unnest

当我执行这段代码时,我期望得到如下结果。

RowNumber  T-id            L-id  unnest
1          T001,T002,T003  1,5   1
2          T001,T002,T003  1,5   5
3          T004,T005       NULL  NULL

但我得到了这个结果:

RowNumber  T-id            L-id  unnest
1          T001,T002,T003  1,5   1
2          T001,T002,T003  1,5   5

我失去了第三排。 然后,我看到了谷歌的官方文档,上面写着:

UNNEST treats NULL as follows.
 ・NULL and empty ARRAY generate zero rows.
 ・An ARRAY containing NULL generates a row containing a NULL value.

但我不想丢失我的空行。

如何保留空行?

请告诉我解决方案...

【问题讨论】:

    标签: sql null google-bigquery unnest


    【解决方案1】:

    使用 LEFT JOIN 代替 CROSS JOIN。这将返回一个空数组的空行。您可能还对文档中的working with arrays topic 感兴趣。

    #StandardSQL
    WITH tableA AS (
      SELECT ["T001", "T002", "T003"] AS T_id, [1, 5] AS L_id
      UNION ALL
      SELECT ["T008", "T009"] AS T_id, NULL AS L_id
    )
    SELECT * FROM tableA
    LEFT JOIN UNNEST(L_id) AS value;
    

    【讨论】:

    • 嗨,Elliott,看起来关键字 unnest 已保留,收到消息“意外关键字 UNNEST”。也许它需要用`符号括起来或称为“unnest_”。
    • 谢谢你,艾略特!我就照你说的做,就能得到我想要的结果。
    • @ElliottBrossard 抱歉,我仍然不明白为什么 LEFT JOIN 可以保留 UNNEST 表中的 NULL 值,但 CROSS JOIN 不能。如果 UNNEST 表中有空值,那么应该还有空值吧?
    • 这就像你离开 join t1 和 t2 一样,其中 t1 为空,t2 有一个。取消嵌套一个空或空数组会返回一个没有行的表。
    • @ElliottBrossard,在左连接中它总是需要一个连接条件。但是在 UNNEST 函数中,我们没有给出任何连接条件,它仍然返回结果。能否解释一下UNNEST函数内部使用的默认连接条件是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多