在where子句中的NULL值

11

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。看起来这是错误的。
为什么会这样?
6个回答

31

NULL无法与任何东西相等。您需要显式地接受null:

where fk <> 4 or fk is null;

请查看处理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;

更多信息请查看维基百科


3

NULL不是一个值,而是一个未知的缺失值。如果你想测试NULL,你必须明确地使用IS NULLIS NOT NULL。例如,NULL甚至对自身进行测试也会得到FALSE。因此,只能通过上述函数(以及ISNULL())来处理与NULL一起工作。你的查询可以重写为:

SELECT * FROM bla WHERE fk <> 4 OR fk IS NULL

2

NULL是一个特殊值,表示“未知”值。它不能与数字(或任何其他值)进行比较,因此结果是 -

NULL和4是否不同?答案是 - 不知道。4是否与未知值不同?

请尝试使用以下方法:

SELECT * FROM bla WHERE fk <> 4 OR FK IS NULL

0

以下语句应该有所帮助:

SELECT * FROM bla WHERE COALESCE(fk,0) <> 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接