4

我正在对 2 列上的 2 个表进行外部连接。如果 table1.column1=table2.column1 和 table1.column2=table2.column2,则应该进行连接。由于允许 column2 包含 null,因此只要值为 null,连接就会失败,因为null不等于null(只有计算机科学家会喜欢它)。

我想出的解决方法是:

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)

这工作正常,但必须有更好的方法?

4

3 回答 3

9

您可以使用 MySQL空安全比较运算符 <=>

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
于 2012-07-19T17:45:44.833 回答
3

我会的LEFT JOIN table2 ON table1.column1 = table2.column1 OR (table1.column1 IS NULL AND table2.column1 IS NULL)。我不确定这是否可行。

(顺便说一句,空值不是值。)

于 2012-07-19T17:47:00.273 回答
0

因为NULLs 存在于源数据中,所以在用于 , 之前默认使用COALESCE(或NVL在 Oracle 中)的值LEFT JOIN,以允许WHERE子句按预期工作。可以是您选择的'DEFAULT_VALUE'任何内容,具体取决于数据类型。这种方法是有效的,因为它消除了混乱并允许表达式正常工作,而不会NULL妨碍。

使用内联视图:

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;

或使用 CTE:

with t1 as
(
    select
    table1.column1
    coalesce(table1.column2,'DEFAULT_VALUE') as column2
    from table1
),
t2 as
(
    select
    table2.column1
    coalesce(table2.column2,'DEFAULT_VALUE') as column2
    from table2
)     
select table1.column1,table1.column1,table2.column1,table2.column2
from t1
left join t2
       on t2.column1 = t1.column1
      and t2.column2 = t1.column2;  
于 2018-11-08T04:50:03.963 回答