SQL 的 NOT IN
子句和 NULL 值故障排除
本文解决了在 SQL 查询中使用 NOT IN
子句时遇到的常见问题:由于 NULL 值导致结果集意外为空。 该场景涉及从 Stock
表(在 Inventory
数据库中)选择 Products
表(在 Subset
数据库中)中不存在的记录。
当 NOT IN
表中的 foreignStockId
列包含 NULL 值时,Products
子句无法按预期运行。 即使 NOT IN
子查询的结果集中存在一个 NULL,也会导致整个查询不返回任何行。
解决方案:
为了纠正这个问题,我们需要显式排除 NULL 值。提出了两种有效的方法:
1。 使用IS NOT NULL
:
此方法从 NOT IN
子查询中过滤掉 NULL:
<code class="language-sql">SELECT stock.IdStock, stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products] WHERE foreignStockId IS NOT NULL);</code>
2。 使用NOT EXISTS
:
NOT EXISTS
子句提供了一种更高效且通常更清晰的替代方案:
<code class="language-sql">SELECT stock.idstock, stock.descr FROM [Inventory].[dbo].[Stock] stock WHERE NOT EXISTS (SELECT * FROM [Subset].[dbo].[Products] p WHERE p.foreignstockid = stock.idstock);</code>
理解问题:三值逻辑
SQL 采用三值逻辑:True、False 和 Unknown。 WHERE
子句的计算结果必须为 True 才能将行包含在结果集中。 出现此问题是因为 'A' <> NULL
的计算结果为 Unknown
。 当 Unknown
比较中存在 NOT IN
时,整个表达式将变为 Unknown
,从而产生空结果集。
示例:
考虑这个:
Predicate | True | False | Unknown |
---|---|---|---|
'A' NOT IN ('X','Y',NULL) |
True | True | Unknown |
Unknown
结果源于 'A' 与 NULL 的比较。 因此,整个 WHERE
子句的计算结果为 Unknown
,并且不返回任何行。
通过使用 IS NOT NULL
或 NOT EXISTS
,我们绕过了这种歧义并确保查询返回预期结果。 在这种情况下,NOT EXISTS
方法通常因其改进的性能和可读性而受到青睐。
以上是为什么我的 SQL'NOT IN”子句不能处理 NULL 值?的详细内容。更多信息请关注PHP中文网其他相关文章!