首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询结果中不包含空值

查询结果中不包含空值
EN

Stack Overflow用户
提问于 2011-05-24 22:45:55
回答 3查看 2.4K关注 0票数 4

考虑下表:

代码语言:javascript
运行
复制
create table inttest (
    someint INT(10) NULL DEFAULT NULL
);

当我插入一些随机值时

代码语言:javascript
运行
复制
insert into inttest 
  (someint) 
values 
  (1),(2),(3),(1),(2),(NULL);

并执行查询

代码语言:javascript
运行
复制
select *
  from inttest 
 where someint != 1;

MySQL返回2,3,2,但不返回空值。这是正确的吗?我应该用OR扩展我的查询,还是说它是我的MySQL安装中的一个错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-24 22:50:39

代码语言:javascript
运行
复制
SELECT 1 != NULL;
-- Output: NULL

比较运算符return TRUEFALSENULL

您期望NULL != 1给您TRUE,但是,明智的是,您通过比较得到了NULL。这是因为比较任何值都是没有意义的:NULL is not a NULL

这里有一个巧妙的技巧,可以让你在结果集中获得NULL,如果你真的想要它。诀窍依赖于颠倒逻辑,然后手动排除NULL的可能性:

代码语言:javascript
运行
复制
SELECT * FROM `inttest`
 WHERE IF(`someint` = 1, FALSE, TRUE);

一种更明显的方法可能是:

代码语言:javascript
运行
复制
SELECT * FROM `inttest`
 WHERE `someint` != '1'
    OR `someint` IS NULL;
票数 1
EN

Stack Overflow用户

发布于 2011-05-24 22:48:34

对,是这样。没有什么能与NULL相提并论--包括NULL。或者更正式地说,计算NULL != 1的结果是UNKNOWN - WHERE子句谓词的计算结果必须为TRUE

票数 3
EN

Stack Overflow用户

发布于 2011-05-24 22:59:29

你必须认为NULL是未知的意思。

在您的特定示例someint <> 1中,您请求SQL引擎过滤掉任何不是1的内容。因为NULL是未知的,所以它可能是1,但我们永远不会知道。因此,SQL引擎不会包含它,因为它不确定它是否不是1。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6112297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档