You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NOT IN未返回含NULL值的行,求正确SQL查询及替代方案

问题原因

这是因为SQL中NULL的逻辑比较特性:当[X]为NULL时,[X] NOT IN (1, 3)的结果是UNKNOWN,而WHERE子句只会保留判断结果为TRUE的行,所以这条NULL记录被过滤掉了。

替代解决方法

方法1:使用NOT EXISTS

NOT EXISTS能正确处理NULL的比较逻辑,当[X]为NULL时,子查询里的t.[X] = vals.v结果为UNKNOWN,EXISTS返回FALSE,NOT EXISTS就会返回TRUE,从而保留这条记录:

SELECT [X], [Y]
FROM MyTable t
WHERE NOT EXISTS (
    SELECT 1 
    FROM (VALUES (1), (3)) AS vals(v) 
    WHERE t.[X] = vals.v
)

方法2:直接添加OR [X] IS NULL

最直观的方式,把NULL的情况直接纳入查询条件:

SELECT [X], [Y]
FROM MyTable
WHERE [X] NOT IN (1, 3) OR [X] IS NULL

方法3:使用EXCEPT

通过"全表数据减去符合排除条件的数据"的逻辑实现,EXCEPT会自动保留NULL行:

SELECT [X], [Y] FROM MyTable
EXCEPT
SELECT [X], [Y] FROM MyTable WHERE [X] IN (1, 3)

内容的提问来源于stack exchange,提问作者user7076710

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:09:32