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

Jer*_*emy 3 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

那么如何最好地实现我想要的呢?

Jef*_*erg 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))
Run Code Online (Sandbox Code Playgroud)

编辑:Works,SQL小提琴在这里

  • 您可能应该在其中放置一些括号,以使您对OP和SQL Server的操作更加明显 (2认同)

Mar*_*ith 7

你也可以

SELECT E1.*
FROM   Example E1
       JOIN Example E2
         ON E2.KeyID = 123
            AND EXISTS (SELECT E2.ForeignID
                        INTERSECT
                        SELECT E1.ForeignID) 
Run Code Online (Sandbox Code Playgroud)