考虑下表:
create table inttest (
someint INT(10) NULL DEFAULT NULL
);
当我插入一些随机值时
insert into inttest
(someint)
values
(1),(2),(3),(1),(2),(NULL);
并执行查询
select *
from inttest
where someint != 1;
MySQL返回2,3,2但不返回NULL值。它是否正确?我应该使用OR someint IS NULL扩展我的查询,还是我的MySQL安装中的错误?
答案 0 :(得分:3)
正确。没有任何内容等于NULL
- 包括NULL
。或者更正式地,评估NULL != 1
的结果是UNKNOWN
- 和WHERE
子句谓词必须评估为TRUE
。
答案 1 :(得分:1)
SELECT 1 != NULL;
-- Output: NULL
比较运算符return TRUE
,FALSE
或NULL
。
您期望NULL != 1
能够TRUE
给您NULL
,但明智的是,您获得NULL
进行比较。这是因为将NULL
与NULL
进行比较是没有意义的: NULL
不值!。
这是一个狡猾的技巧,如果你真的想要它,你可以在结果集中得到SELECT * FROM `inttest`
WHERE IF(`someint` = 1, FALSE, TRUE);
。该技巧依赖于反转逻辑,然后手动排除SELECT * FROM `inttest`
WHERE `someint` != '1'
OR `someint` IS NULL;
可能性:
{{1}}
更明显的方法可能是:
{{1}}
答案 2 :(得分:0)
您必须将NULL视为UNKNOWN。
在您的特定情况下,someint <> 1
,您要求SQL引擎过滤掉任何不是1的内容。由于NULL是UNKNOWN,它可以为1但我们会永远不会知道因此,SQL引擎不会包含它,因为它不确定它不是1。