我在BigQuery的多个键上遇到了左外连接的奇怪事情.如果其中一个键null位于右表上,则它不匹配,因此它会null输入右表的所有值.
如果我有2张桌子
Table1 Table2
------------ ----------------
k1 |k2 |v3 k1 |k2 | v4
------------ ----------------
foo|boo |hey foo|NULL| you
bar|test|yo bar|test| hi
foo|NULL|hey
Run Code Online (Sandbox Code Playgroud)
我做以下加入
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
Run Code Online (Sandbox Code Playgroud)
我得到这样的结果
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.
Run Code Online (Sandbox Code Playgroud)
我希望最后一行是
foo |NULL |hey |you
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?有了这个,我的意思是没有匹配NULL.
有没有其他方法可以产生我想要的结果?
在SQL中,NULL不等于任何东西 - 甚至本身.
戈登的回答有一些合理的建议,但请注意,BigQuery仅支持连接条件,这些连接条件是等式的连接,它排除了使用OR或IS NULL.
你能使用除null之外的sentinel值吗?例如,如果替换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
Run Code Online (Sandbox Code Playgroud)
您可以添加外部选择以将字符串"null"重新变为实数NULL.
显然,只有"null"在数据中其他地方没有出现字符串时,这才有效.