我正在2列上进行2个表的外连接。如果table1.column1 = table2.column1和table1.column2 = table2.column2,则应该进行连接。由于允许column2包含null,因此只要值为null,连接就会失败,因为 null 不等于 null (只有计算机科学家才能喜欢)。 / p>
我想出的解决方法是:
select table1.column1,table1.colunn1,table2.column1,table2.column2 from
table1
left join table2
on table1.column1=table2.column1
and if(table1.column2 is null,table2.column2 is null, table1.column2=table2.column2)
这是正常的,但必须有更好的方法吗?
答案 0 :(得分:9)
您可以使用MySQL null-safe comparison operator <=>
:
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
LEFT JOIN table2 t2
ON t1.column1 = t2.column1 AND t1.column2 <=> t2.column2
答案 1 :(得分:3)
我会做LEFT JOIN table2 ON table1.column1 = table2.column1 OR (table1.column1 IS NULL AND table2.column1 IS NULL)
。我不确定这是否有效。
(顺便说一句,空值不是值。)
答案 2 :(得分:0)
由于源数据中存在NULL
,因此在COALESCE
中使用NVL
(在Oracle中为LEFT JOIN
)的默认值,以允许{ {1}}子句可以按预期工作。根据数据类型,WHERE
可以是您选择的任何内容。这种方法之所以有效,是因为它消除了混乱并允许表达式正常工作,而没有'DEFAULT_VALUE'
的阻碍。
使用内联视图:
NULL
或使用CTE:
select table1.column1,table1.column1,table2.column1,table2.column2
from
(
select
table1.column1
coalesce(table1.column2,'DEFAULT_VALUE') as column2
from table1
) t1
left join (
select
table2.column1
coalesce(table2.column2,'DEFAULT_VALUE') as column2
from table2
) t2
on t2.column1 = t1.column1
and t2.column2 = t1.column2;