SQL 的 NOT IN
子句和 NULL 值的细微差别
SQL 中的 NOT IN
子句用于排除与指定列表中的值匹配的行。 然而,此列表中 NULL
值的存在带来了复杂性。
问题:NULL 的意外结果
考虑这些 SQL 查询:
<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
比较的方式。 查询 A 检查 3 是否等于列表中的任何 值。 由于 3 等于 3,因此返回结果。
不等于 到 每个 值。启用 ANSI_NULLS(许多系统中的默认设置)后,涉及 的比较结果为 NULL
。 UNKNOWN
既非真亦非假;因此,查询 B 不返回任何行。UNKNOWN
ANSI_NULLS 设置及其影响
禁用 ANSI_NULLS 会改变 比较行为。 关闭 ANSI_NULLS 后,与 NULL
的比较如果值不相等则返回 TRUE,如果相等则返回 FALSE。 因此,查询 B 将返回禁用 ANSI_NULLS 的结果,因为 NULL
的计算结果为 TRUE。3 NOT IN (1, 2, NULL)
理解 NULL 的本质
重要的是要记住 表示未知值。 将 NULL
与任何值进行比较总是会产生 NULL
,因为无法明确确定相等或不相等。当使用带有 UNKNOWN
值的 NOT IN
时,必须预见到潜在的问题,并且应该实施适当的技术(例如显式 NULL
检查或使用 NULL
将 COALESCE
替换为已知值)以实现稳健的查询处理.NULL
以上是NULL 值如何影响 SQL NOT IN 子句的结果?的详细内容。更多信息请关注PHP中文网其他相关文章!