当你想要NULL = NULL时,在SQL中做什么?

时间:2013-04-09 20:27:01

标签: sql sql-server null

想象一个表(名为Example),它有一个主键字段(KeyID)和一个外键字段(ForeignID)。此外键用于将表中的行链接到单独表中的外部行/项,从而建立多对一关系。但是,对于我们的许多行,不存在这样的关系,因此我们的外键字段在这些行中为NULL

现在,如果我们获得一个KeyID(例如123),那么获取包含所有行具有匹配的ForeignID值的结果集的首选SQL是什么?

我天真地开始使用以下SQL:

SELECT E1.*
FROM Example E1
JOIN Example E2
  ON E2.KeyID = 123
  AND E2.ForeignID = E1.ForeignID

当匹配的键行在ForeignID中具有正常值时,这非常有用。但是,如果ForeignID恰好是NULL,它将失败(不返回任何内容)。在做了一些初步搜索后,我现在明白了为什么(在阅读this one之类的问题之后),但我没有找到任何解决这个限制的好方法。

授权SQL Server具有我可以更改的ANSI_NULLS设置,但这似乎是一个肮脏的,可能有问题的黑客。

或者,我总是可以组成自己的伪空值(如0)并将其粘贴在ForeignID列而不是NULL中,但这会破坏我为此列建立的外键约束

那么如何最好地实现我的目标呢?

2 个答案:

答案 0 :(得分:8)

未经测试,但我认为你可以这样做:

SELECT E1.*
FROM Example E1
JOIN Example E2
  ON E2.KeyID = 123
  AND (E2.ForeignID = E1.ForeignID
    OR (E2.ForeignID IS NULL AND E1.ForeignID IS NULL))

编辑:Works,SQL Fiddle here

答案 1 :(得分:7)

You can also do

SELECT E1.*
FROM   Example E1
       JOIN Example E2
         ON E2.KeyID = 123
            AND EXISTS (SELECT E2.ForeignID
                        INTERSECT
                        SELECT E1.ForeignID)