我必须在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 将始终包含Mobile
或Email
,但绝不会两者都有。如示例中所示, MainTable 在 ReferenceTable 中可能没有匹配,因此外部联接。
答案 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)