为什么null不等于null false

rou*_*ble 21 sql database null nullable

我正在读这篇文章: 在SQL中获取null == null

并且一致认为,当尝试测试两个(可为空)sql列之间的相等性时,正确的方法是:

where ((A=B) OR (A IS NULL AND B IS NULL))
Run Code Online (Sandbox Code Playgroud)

当A和B为NULL时,(A = B)仍然返回FALSE,因为NULL不等于NULL.这就是需要额外检查的原因.

在测试不平等时呢?根据上面的讨论,它让我认为,为了测试不平等,我需要做一些像:

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)

但是,我注意到这没有必要(至少在informix 11.5上没有),我可以这样做:

where (A<>B)
Run Code Online (Sandbox Code Playgroud)

如果A和B为NULL,则返回FALSE.如果NULL不等于NULL,那么这不应该返回TRUE吗?

编辑
这些都是很好的答案,但我认为我的问题有点模糊.请允许我改写一下:

鉴于A或B都可以为NULL,是否足以检查它们的不等式

where (A<>B)
Run Code Online (Sandbox Code Playgroud)

或者我需要明确检查它:

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)

请参阅此主题以获得此问题的答案.

Ben*_*n S 34

因为该行为遵循已建立的三元逻辑,其中NULL被视为未知值.

如果您认为NULL为未知,则会变得更加直观:

unknown a等于unknown b?没有办法知道,所以:unknown.

  • 伟大的观点!另一种看待它的方法是,如果"未知a"等于"未知b",那么它们就不可能真的那么不为人知,因为你对它们有所了解.一种量子力学-y. (3认同)

jus*_*ody 26

涉及NULL的关系表达式实际上再次产生NULL

编辑

在这里,<>代表任意的二进制运算符,NULL是SQL占位符,value是任何值(NULL不是一个值):

  • NULL <> value - > NULL
  • NULL <> NULL - > NULL

逻辑是:NULL意味着"没有价值"或"未知价值",因此与任何实际价值的任何比较都没有意义.

X = 42真的,假的,或未知的,因为你不知道什么价值(如果有的话)X成立?SQL说这是未知的.是X = Y真的,假的,还是未知的,因为两者都是未知的?SQL表示结果未知.并且它对于任何二进制关系操作都是如此,这只是逻辑的(即使模型中的NULL不在第一位).

SQL还提供了两个一元后缀运算符,IS NULL并且IS NOT NULL根据它们的操作数返回TRUE或FALSE.

  • NULL IS NULL - > TRUE
  • NULL IS NOT NULL - > FALSE


Ada*_*son 7

涉及的所有比较null都是未定义的,并且评估为false.这个想法阻止null被评估为等价null,也阻止null被评估为等同于null.

  • 我做到了.任何涉及null的比较都将返回NULL (3认同)
  • @Adam Robinson:我只是想清除它,虽然它永远不会是真的,但它也永远不会错.比较评估为null(技术上:为'未知').这不是假的,因为如果是的话,你可以否定它并实现,你不能.从不采用分支(或行永不匹配)因为那些依赖于真值.[Wikipedia比我更好地解释它.](https://secure.wikimedia.org/wikipedia/en/wiki/Null_%28SQL%29). (2认同)