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 表示未知或缺失值。 它与 IN
和 NOT IN
等谓词的交互由 ANSI_NULLS
设置控制。
启用 ANSI_NULLS
(默认)时,涉及 NULL 的比较计算结果为 UNKNOWN,除非使用 IS NULL
或 IS 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中文网其他相关文章!