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)
请参阅此主题以获得此问题的答案.
jus*_*ody 26
涉及NULL的关系表达式实际上再次产生NULL
编辑
在这里,<>代表任意的二进制运算符,NULL是SQL占位符,value是任何值(NULL是不是一个值):
NULL <> value - > NULLNULL <> NULL - > NULL逻辑是:NULL意味着"没有价值"或"未知价值",因此与任何实际价值的任何比较都没有意义.
是X = 42真的,假的,或未知的,因为你不知道什么价值(如果有的话)X成立?SQL说这是未知的.是X = Y真的,假的,还是未知的,因为两者都是未知的?SQL表示结果未知.并且它对于任何二进制关系操作都是如此,这只是逻辑的(即使模型中的NULL不在第一位).
SQL还提供了两个一元后缀运算符,IS NULL并且IS NOT NULL根据它们的操作数返回TRUE或FALSE.
NULL IS NULL - > TRUENULL IS NOT NULL - > FALSE涉及的所有比较null都是未定义的,并且评估为false.这个想法阻止null被评估为等价null,也阻止null被评估为等同于null.
| 归档时间: |
|
| 查看次数: |
34238 次 |
| 最近记录: |