【问题标题】:BigQuery Standard SQL automatically replace null with zero on left joinBigQuery 标准 SQL 在左连接时自动将 null 替换为零
【发布时间】:2019-10-30 04:35:12
【问题描述】:

我正在使用 BigQuery 中的两个表,它们大致遵循以下格式:

t1

p1   num1
joe  25
tom  35
tim  20

t2

p1   num2
joe  15
tom  13

... 我需要执行左连接。请注意,t2 中的名称与 t1 中的名称不同,当我在 t1 上执行 t2 的左连接时,我希望 num2 为零,而不是 null。

SELECT 
  t1.p1, t1.num, t2.num
FROM t1
LEFT JOIN t2 ON t1.p1 = t2.pi

我知道IFNULL 函数,但是我宁愿避免以下解决方案:

SELECT 
  t1.p1, t1.num, IFNULL(t2.num, 0)
FROM t1
LEFT JOIN t2 ON t1.p1 = t2.p1

这样做的原因是因为我有一个非常大的查询,其中包含约 5 个左连接和约 50 列,并且对于所有 50 列,空值应该全部替换为零。我注意到当我用IFNULL(t2.num, 0) 替换选择中的所有t2.num 行时,BigQuery 明显滞后。

我想避免在列级别解决问题的解决方案(例如,需要 IFNULL 的 50 列),并且更喜欢在左连接级别解决空值的解决方案(对于 5 个表)。

对此的任何想法将不胜感激!

编辑: 任何关于 50 个 IFNULL 为何落后于 BigQuery 编辑器的想法将不胜感激。通过滞后编辑器,我的字面意思是当我尝试在查询编辑器中输入时,我输入的内容需要几秒钟才能出现。 IFNULL 不会改变查询处理的数据量(~1GB),所以我很惊讶它们造成了如此多的延迟。了解这个问题可以帮助我在未来编写更好的查询。

EDIT2:我现在意识到我分享的代码示例没有帮助。请让我知道更长的代码示例是否有助于解决问题。

【问题讨论】:

  • 你和COALESCE(t2.num, 0)有同样的“问题”吗?只是检查:o)
  • 会试一试
  • @MikhailBerlyant 使用COALESCEIFNULL 似乎同样滞后

标签: google-bigquery


【解决方案1】:

不确定我是否得到了您的根本问题 - 但您可能想探索以下选项/方向(这消除了 IFNULL 的使用,但需要一些额外的努力来构建这些额外的联合所有的更多的左连接而不是简单的示例)

#standardSQL
SELECT t1.p1, t1.num num1, t2.num num2
FROM t1 JOIN t2 ON t1.p1 = t2.p1 
UNION ALL
SELECT p1, num, 0 FROM t1 WHERE NOT EXISTS (
  SELECT 1 FROM t2 WHERE p1 = t1.p1
)

当应用于您问题的样本数据时 - 结果是

Row p1  num1    num2     
1   tim 20      0    
2   joe 25      15   
3   tom 35      13   

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多