首页 > 数据库 > mysql教程 > 为什么我的 SQL'NOT IN”子句不能处理 NULL 值?

为什么我的 SQL'NOT IN”子句不能处理 NULL 值?

Susan Sarandon
发布: 2025-01-18 11:21:09
原创
433 人浏览过

Why Doesn't My SQL `NOT IN` Clause Work with NULL Values?

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 NULLNOT EXISTS,我们绕过了这种歧义并确保查询返回预期结果。 在这种情况下,NOT EXISTS 方法通常因其改进的性能和可读性而受到青睐。

以上是为什么我的 SQL'NOT IN”子句不能处理 NULL 值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板