我有一张像这样的表“bla”:
[id] [name] [fk]
1 test 4
2 foo 5
3 bar NULL
如果我执行sql查询
SELECT * FROM bla WHERE fk <> 4
我只获得id为2的记录。我没有获得id为3的记录,其中fk为null。 我以为NULL!= 4.似乎这是错误的。
为什么会这样?
答案 0 :(得分:28)
答案 1 :(得分:4)
由于NULL
代表UNKNOWN
,当您将值与UNKNOWN
进行比较时,结果将始终为false。
看看这个比较 -
NULL = NULL -- false, since both are unknown, so the truth value of this expression can't be determined.
NULL = 4 -- false
4 = 4 -- true, since both values are known.
如果要获取包含NULL
的记录,则需要以这种方式重新编写查询 -
where fk <> 4
OR fk is null;
有关详细信息,请参阅Wikipedia。
答案 2 :(得分:2)
NULL
的特殊之处在于它代表“未知”值。这不能与数字(或任何其他值)进行比较,因此结果 -
是NULL
&lt;&gt; 4?答案是 - 不知道。 4是不同的未知值?
请改为尝试:
SELECT * FROM bla WHERE fk <> 4 OR FK IS NULL
答案 3 :(得分:2)
NULL不是值,而是未知的值。如果您要测试NULL,则必须使用IS NULL
和IS NOT NULL
明确地进行测试。例如,NULL将测试 FALSE ,甚至对NULL本身。因此,working with NULL仅使用上述函数(和ISNULL()
)完成。您的查询可以重写为
SELECT * FROM bla WHERE fk <> 4 OR fk IS NULL
答案 4 :(得分:0)
怎么样
SELECT * FROM bla WHERE NOT (fk = 4)
逻辑:
NULL = 4 --false
5 = 4 --false
4 = 4 --true
NOT (NULL = 4) --true
NOT (5 = 4) --true
NOT (4 = 4) --false
答案 5 :(得分:0)
以下声明应该有所帮助:
SELECT * FROM bla WHERE COALESCE(fk,0)&lt;&gt; 4