google-bigquery - 如果其中一个为空,则 BigQuery 中多个键的左外连接不会

标签 google-bigquery

我在 BigQuery 中的多个键上使用左外连接时遇到了一些奇怪的问题。如果其中一个键是 null在右边的 table 上它不匹配,因此它把 null在右表的所有值中。

如果我有两张 table

   Table1              Table2
------------      ----------------
 k1 |k2  |v3      k1 |k2  | v4
------------      ----------------
 foo|boo |hey     foo|NULL| you
 bar|test|yo      bar|test| hi
 foo|NULL|hey

我做了以下加入
SELECT t1.k1, t1.k2, t1.v3, t2.v4 FROM [Table1] t1
LEFT OUTER JOIN EACH [Table2] t2 
ON t1.k1=t2.k1 AND t1.k2=t2.k2

我得到这样的结果
t1_k1|t1_k2|t1_v3|t2_v4
-----------------------
foo  |boo  |hey  |NULL  --No match here so NULL in t2_v4 it's ok
bar  |test |hey  |hi    --It matches here on bar and test
foo  |NULL |hey  |NULL  --It doesn't match on foo NULL.

我希望最后一行是
foo  |NULL |hey  |you

这是预期的行为吗?我的意思是在 NULL 上没有匹配项.

有没有其他方法可以产生我想要的结果?

最佳答案

在 SQL 中,NULL不等于任何东西——甚至它本身。

Gordon's answer有一些合理的建议,但请注意,BigQuery 仅支持作为等式连接的连接条件,这排除了使用 OR 的可能性。或 IS NULL .

您可以使用 null 以外的标记值吗?例如,如果您替换 NULL使用空字符串(或字符串 "null" ,或数据中其他地方没有出现的其他内容),连接将按您的预期工作。您甚至可以通过使用子查询以最低的性能成本即时执行此操作。

SELECT t1.k1, t1.k2, t1.v3, t2.v4
FROM
  (SELECT IFNULL(k1, "null") k1, IFNULL(k2, "null") k2 FROM [Table1]) t1
LEFT OUTER JOIN EACH
  (SELECT IFNULL(v3, "null") v3, IFNULL(v4, "null") v4 FROM [Table2]) t2
ON t1.k1 = t2.k1 AND t1.k2 = t2.k2

您可以添加一个外部选择来转动字符串 "null"变回真实NULL .

显然,这仅适用于字符串 "null"不会出现在您数据的其他地方。

关于google-bigquery - 如果其中一个为空,则 BigQuery 中多个键的左外连接不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31331338/

相关文章:

Python BigQuery 脚本 bigquery.jobs.create 错误

python - 我可以以编程方式检查 google bigquery 查询成本吗?

python - 无法找到 Google 示例代码中引用的 Python 示例模块

sql - 需要为文本正文中的特定单词格式化 BigQuery 中的表格

google-bigquery - BigQuery 上比特币交易的最大时间戳?

google-bigquery - 如果在大查询中不存在,如何使用命令行或 sql 创建表

google-bigquery - 将 BigQuery 表切换为 "readonly mode"

postgresql - Airflow 将 postgres 数据库的所有表导出到 BigQuery

json - 如何从 BigQuery 中的平面表创建嵌套的 JSON 格式表?

google-bigquery - 使用 Bigquery 将逗号分隔的字符串拆分为行