首页 >数据库 >mysql教程 >为什么 SQL 中的'NOT IN”会返回带有 NULL 值的意外结果?

为什么 SQL 中的'NOT IN”会返回带有 NULL 值的意外结果?

Susan Sarandon
Susan Sarandon原创
2025-01-23 12:36:12825浏览

Why Does `NOT IN` Return Unexpected Results with NULL Values in SQL?

SQL 的 NOT IN 子句和 NULL 值的细微差别

SQL 中的一个常见挑战涉及将数据与值集进行比较,特别是当存在 NULL 时。 让我们用几个示例查询来检查一下:

<code class="language-sql">A: SELECT 'true' WHERE 3 IN (1, 2, 3, NULL);
B: SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>

查询 A 产生结果,但查询 B 没有。此行为源于 SQL 如何处理 NOT IN 子句中的 NULL。

在 SQL 中,NULL 表示未知或缺失值。 它与 INNOT IN 等谓词的交互由 ANSI_NULLS 设置控制。

启用 ANSI_NULLS(默认)时,涉及 NULL 的比较计算结果为 UNKNOWN,除非使用 IS NULLIS NOT NULL 显式检查。

在查询 A 中,将 3 与包含 NULL 的列表进行比较会得到 TRUE 评估,因为存在 3。 NULL 值不会影响整体结果。

但是查询 B 使用 NOT IN。 由于 ANSI_NULLS 处于打开状态,因此由于 3 和 NULL 之间的比较,比较 3 NOT IN (1, 2, NULL) 的计算结果为 UNKNOWN。 因此,查询返回一个空集。

禁用ANSI_NULLS会改变这一点。 NULL 的处理方式与任何其他值一样。 在这种情况下,3 NOT IN (1, 2, NULL) 将计算为 TRUE,因为 3 不同于 1、2 和 NULL。 因此,查询 B 将产生 ANSI_NULLS 关闭的结果。

这强调了在 SQL 中处理 NULL 时 ANSI_NULLS 设置的重要性。 通过管理此设置,您可以控制涉及 NULL 的谓词行为并获得所需的查询结果。

以上是为什么 SQL 中的'NOT IN”会返回带有 NULL 值的意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn