i've got a table "bla" like this:
我有一个名为“bla”的表格,其内容如下:
[id] [name] [fk]
1 test 4
2 foo 5
3 bar NULL
如果我执行SQL查询
SELECT * FROM bla WHERE fk <> 4
我只得到了ID为2的记录,我没有得到ID为3且外键为空的记录。我以为NULL != 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;
更多信息请查看维基百科。
NULL不是一个值,而是一个未知的缺失值。如果你想测试NULL,你必须明确地使用IS NULL
和IS NOT NULL
。例如,NULL甚至对自身进行测试也会得到FALSE。因此,只能通过上述函数(以及ISNULL()
)来处理与NULL一起工作。你的查询可以重写为:
SELECT * FROM bla WHERE fk <> 4 OR fk IS NULL
NULL
是一个特殊值,表示“未知”值。它不能与数字(或任何其他值)进行比较,因此结果是 -
NULL
和4是否不同?答案是 - 不知道。4是否与未知值不同?
请尝试使用以下方法:
SELECT * FROM bla WHERE fk <> 4 OR FK IS NULL
以下语句应该有所帮助:
SELECT * FROM bla WHERE COALESCE(fk,0) <> 4
怎么样?
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