一尘不染

NOT IN子句中的NULL值

sql

当我获得不同的记录计数时,出现了这个问题,我认为这是相同的查询,一个使用not in where约束,另一个使用a left joinnot in约束中的表具有一个空值(错误数据),该空值导致该查询返回计数为0的记录。我有点理解为什么,但是我可以使用一些帮助来完全理解这个概念。

简单地说,为什么查询A返回结果而B不返回结果?

A: select 'true' where 3 in (1, 2, 3, null)
B: select 'true' where 3 not in (1, 2, null)

这是在SQL Server 2005上。我还发现调用set ansi_nulls off导致B返回结果。


阅读 191

收藏
2021-03-17

共1个答案

一尘不染

查询A与以下内容相同:

select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null

既然3 = 3是真的,那么您会得到结果。

查询B与以下内容相同:

select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null

如果ansi_nulls是,3 <> null是未知的,所以谓词计算结果为未知的,你没有得到任何行。

ansi_nullsoff3 <> null为true时,谓词为true,因此谓词的值为true,您将获得一行。

2021-03-17