小编典典

NOT IN 子句中的 NULL 值

all

当我为我认为相同的查询一个使用not in where约束而另一个使用left join. 约束中的表not 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 返回结果。


阅读 84

收藏
2022-05-04

共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为 UNKNOWN,因此谓词计算结果为 UNKNOWN,并且您不会得到任何行。

何时ansi_nulls关闭,3 <> null则为真,因此谓词评估为真,并且您得到一行。

2022-05-04