了解 SQL 中 NULL 值和 NOT IN
子句的意外行为
当 NULL
值与 NOT IN
运算符交互时,SQL 查询通常会产生令人惊讶的结果。 当将 NOT IN
查询与使用 LEFT JOIN
.
考虑这些问题:
<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 数据库如何处理 NULL
值。
启用 ANSI_NULLS
(许多系统(如 SQL Server 2005)中的默认设置),任何涉及 NULL
的比较(例如 3 = NULL
)都会计算为 UNKNOWN
。这种不确定性源于NULL
.
在查询 B 中,NOT IN
运算符在子查询中遇到 NULL
,从而产生 UNKNOWN
计算。 由于没有其他值匹配,整个谓词变为 UNKNOWN
,产生空结果集。
相反,禁用ANSI_NULLS
会改变行为。 当 ANSI_NULLS
关闭时,3 = NULL
的计算结果为 TRUE
。 SQL 将 NULL
解释为可能等于一切,包括它本身。 因此,查询 B 的谓词计算结果为 TRUE
,返回结果。
简而言之,不一致的结果源于对 NULL
设置确定的 ANSI_NULLS
值的不同处理。 当 ANSI_NULLS
启用时,与 NULL
的比较会产生 UNKNOWN
,从而导致在使用 NOT IN
和 NULL
值的查询中出现意外结果。 这凸显了理解 NULL
SQL 处理以获得准确查询结果的重要性。
以上是为什么 NULL 值会导致 SQL 的 NOT IN 子句出现意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!