我在 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/