SQL条件为NULL

时间:2014-08-05 16:19:32

标签: sql sql-server-2008

我有以下工作选择:

SELECT
    TableA.FullName
FROM
    TableA,
    TableB
WHERE
    TableA.Contact = TableB.Contact

但是我在TableB中有一些在TableB.Contact列中有NULL的行,我想展示它。我试过了:

WHERE
    (TableA.Contact = TableB.Contact OR TableB.Contact IS NULL)

没有幸运。

3 个答案:

答案 0 :(得分:2)

您需要使用LEFT JOIN

    SELECT
        a.FullName, a.Contact, b.Contact
    FROM TableA a 
    LEFT JOIN TableB b ON b.Contact = a.Contact
WHERE
    (a.Contact = b.Contact OR b.Contact IS NULL)

WHERE子句在这里是多余的 - 与LEFT JOIN

相同

答案 1 :(得分:2)

您使用的是过时的JOIN格式。尝试将其更改为:

SELECT column1, column2, column3 FROM 
TableA as a
LEFT JOIN TableB as b
ON a.contact = b.contact

使用左连接将从A中提取所有记录,无论B中是否存在匹配。这是各种连接如何工作的一个很好的解释:

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

另外,请注意我是专门提取我想要的列而不是*。这是习惯使用SQL的好习惯。

更新:

发表评论后,您好像在寻找FULL OUTER JOIN

SELECT column1, column2
FROM TableA as a
FULL OUTER JOIN TableB as b
ON a.contact = b.contact

答案 2 :(得分:1)

尝试更改join条件:

SELECT *
FROM TableA JOIN
     TableB
     ON TableA.Contact = TableB.Contact OR
        TableA.Contact IS NULL AND TableB.Contact IS NULL;

left outer join不会完全符合您的要求。它将所有行保留在TableA中,但不检查匹配的值。

出于性能原因,以下内容可能会更好:

SELECT *
FROM TableA JOIN
     TableB
     ON TableA.Contact = TableB.Contact
UNION ALL
SELECT *
FROM TableA CROSS JOIN
     TableB
WHERE TableA.Contact IS NULL AND TableB.Contact IS NULL;