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
相关产品推荐
相关产品推荐

