两个表都包含NULL时如何JOIN ON

时间:2012-07-19 17:43:28

标签: mysql sql join null

我正在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)

这是正常的,但必须有更好的方法吗?

3 个答案:

答案 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;