外部连接两列并在T-SQL中跳过Null

时间:2014-07-02 10:52:51

标签: sql join

我必须在A列或B列上left outer join而不是NULL

所以我不确定我会怎么做。

如果仅仅是跳过NULL的情况,我可以在联接where上添加select子句,但因为我需要两个不起作用的列。

以下是我要完成的示例:

**MainTable**

| Mobile |  Email  | MoreInfo |
|  1234  |         |    a     |
|  1234  |         |    b     |
|        | c@c.com |    c     |
|  9999  |         |    d     |
|  4321  |         |    e     |
|        | a@a.com |    f     |

**ReferenceTable**

| Mobile |  Email  | Id |
|  1234  |         | 1  |
|  4321  |         | 2  |
|        | a@a.com | 3  |
|        | b@b.com | 4  |

SELECT mt.MoreInfo, rt.Id
FROM MainTable mt
LEFT OUTER JOIN ReferenceTable rt ON mt.Mobile = rt.Mobile OR mt.Email = rt.Email

我想要解决的是:

| MoreInfo |  Id  |
|    a     |   1  |
|    b     |   1  |
|    c     | NULL |
|    d     | NULL |
|    e     |   2  |
|    f     |   3  |

但肯定会在C和D中获得一个值,以及它们在电子邮件或移动设备中的空值或空值将与参考表中的此类值匹配。

修改

我想要注意 ReferenceTable 将始终包含MobileEmail,但绝不会两者都有。如示例中所示, MainTable ReferenceTable 中可能没有匹配,因此外部联接。

Fiddle here

2 个答案:

答案 0 :(得分:2)

Dimt的修改版本回答了保护,无法比较空字符串

SELECT mt.MoreInfo, rt.Id
    FROM MainTable mt
    LEFT OUTER JOIN ReferenceTable rt 
    ON (mt.Mobile = rt.Mobile AND coalesce(rt.Mobile, '')<>'') 
       OR (mt.Email = rt.Email AND coalesce(rt.Email, '')<>'')

答案 1 :(得分:1)

关于为消除空值或空值(例如

)添加额外条件的内容
   SELECT mt.MoreInfo, rt.Id
    FROM MainTable mt
    LEFT OUTER JOIN ReferenceTable rt 
    ON (mt.Mobile = rt.Mobile AND rt.Mobile IS NOT NULL) OR (mt.Email = rt.Email AND rt.Email IS NOT NULL)