where子句中的NULL值

时间:2011-07-26 08:02:55

标签: mysql sql null

我有一张像这样的表“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.似乎这是错误的。

为什么会这样?

6 个答案:

答案 0 :(得分:28)

NULL不等于任何东西。您需要明确接受空值:

where fk <> 4 or fk is null;

有关NULL处理的详情,请参阅Working with NULL

答案 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 NULLIS 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