考虑下表:
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,但不返回空值。这是正确的吗?我应该用OR扩展我的查询,还是说它是我的MySQL安装中的一个错误?
发布于 2011-05-24 22:50:39
SELECT 1 != NULL;
-- Output: NULL比较运算符return TRUE、FALSE或NULL。
您期望NULL != 1给您TRUE,但是,明智的是,您通过比较得到了NULL。这是因为比较任何值都是没有意义的:NULL is not a NULL!。
这里有一个巧妙的技巧,可以让你在结果集中获得NULL,如果你真的想要它。诀窍依赖于颠倒逻辑,然后手动排除NULL的可能性:
SELECT * FROM `inttest`
WHERE IF(`someint` = 1, FALSE, TRUE);一种更明显的方法可能是:
SELECT * FROM `inttest`
WHERE `someint` != '1'
OR `someint` IS NULL;发布于 2011-05-24 22:48:34
对,是这样。没有什么能与NULL相提并论--包括NULL。或者更正式地说,计算NULL != 1的结果是UNKNOWN - WHERE子句谓词的计算结果必须为TRUE。
发布于 2011-05-24 22:59:29
你必须认为NULL是未知的意思。
在您的特定示例someint <> 1中,您请求SQL引擎过滤掉任何不是1的内容。因为NULL是未知的,所以它可能是1,但我们永远不会知道。因此,SQL引擎不会包含它,因为它不确定它是否不是1。
https://stackoverflow.com/questions/6112297
复制相似问题