查询结果中不包含 NULL 值

发布于 2024-11-09 14:00:25 字数 399 浏览 0 评论 0原文

考虑下表:

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 安装中的错误?

Considering the following table:

create table inttest (
    someint INT(10) NULL DEFAULT NULL
);

When I insert some random values

insert into inttest 
  (someint) 
values 
  (1),(2),(3),(1),(2),(NULL);

and execute the query

select *
  from inttest 
 where someint != 1;

MySQL returns 2,3,2 but not the NULL value. Is this correct? Should I extend my query with OR someint IS NULL or is it a bug in my MySQL installation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

雨后彩虹 2024-11-16 14:00:25

正确的。没有任何东西等于 NULL - 包括 NULL。或者更正式地说,计算 NULL != 1 的结果是 UNKNOWN - 并且 WHERE 子句谓词必须计算为 TRUE.

Correct. Nothing is equal to NULL - including NULL. Or more formally, the result of evaluating NULL != 1 is UNKNOWN - and WHERE clause predicates have to evaluate to TRUE.

我家小可爱 2024-11-16 14:00:25
SELECT 1 != NULL;
-- Output: NULL

比较运算符返回 TRUEFALSENULL

您期望 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;
SELECT 1 != NULL;
-- Output: NULL

Comparison operators return TRUE, FALSE or NULL.

You're expecting NULL != 1 to give you TRUE but, sensibly, you get NULL for the comparison you make. This is because comparing anything with NULL is meaningless: NULL is not a value!.

Here's a cunning trick whereby you could get the NULL in the resultset if you still really want it. The trick relies on reversing the logic, then manually excluding the NULL possibility:

SELECT * FROM `inttest`
 WHERE IF(`someint` = 1, FALSE, TRUE);

A more obvious approach might be:

SELECT * FROM `inttest`
 WHERE `someint` != '1'
    OR `someint` IS NULL;
故乡的云 2024-11-16 14:00:25

您必须将 NULL 视为未知的意思。

在您的具体情况下,someint <> 1,您要求 SQL 引擎过滤掉任何不是 1 的内容。由于 NULL 是未知的,因此它可能是 1,但我们永远不会知道。因此,SQL 引擎不会包含它,因为它不确定它不是 1。

You have to think of NULL as meaning UNKNOWN.

In your specific case, someint <> 1, you are asking the SQL engine to filter out anything that is not a 1. Since NULL is UNKNOWN, it could be a 1 but we will never know. Because of this, the SQL engine won't include it because it's not sure that it's not a 1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文