NOT IN子句中的NULL值

318

当我认为两个查询是相同的,一个使用not in约束条件,另一个使用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返回一个结果。

12个回答

1

这是给男孩的:

select party_code 
from abc as a
where party_code not in (select party_code 
                         from xyz 
                         where party_code = a.party_code);

无论ANSI设置如何,这都可以正常工作。


针对原始问题: B: select 'true' where 3 not in (1, 2, null)必须采取一种去除空值的方法,例如: select 'true' where 3 not in (1, 2, isnull(null,0))总体逻辑是,如果 NULL 是问题的原因,则在查询的某个步骤中找到一种去除 NULL 值的方法。 - Rostand Abear
选择 abc 表中的 party_code,别忘了该字段通常允许为空,因此在 xyz 表中 party_code 不为空的情况下也要排除。 - Rostand Abear

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接