mssql sqlserver not in查询数据遇到的坑


摘要:
下文讲述sql脚本查询中,not in查询所遇到的坑及避免方法
实验环境:sql server 2008 R2


今天在使用not in 脚本检索数据时,发现有些数据并没有查询出来,通过仔细测试观察,发现是由于列值存在null,所导致的,下文将记载此类现象,
避免以后出现此类情况。

   create table [maomao365.com]
(keyId int identity(1,1),
 info  varchar(300) null )
go
insert into [maomao365.com]
(info)values('sqlblog'),(null),
('sqlserver'),('other'),
('sql'),(null)
go

select * from [maomao365.com] 
where info not in (
 'sqlblog','sql')
 
go
truncate table [maomao365.com]
drop     table [maomao365.com]

从上例的输出中,我们可以看出,只返回了两条数据,info等于null的数据未返回到数据库中,
那么可以证实not in数据检索,并不能返回列值为null的数据



为避免此类异常,我们有两种方法处理此异常:
方法1:在表设计时,避免所有列出现null值
方法2:在数据操作或检索时,对null列值进行单独处理,例:
select * from [maomao365.com]
where
(
info not in (‘sqlblog’,’sql’)
or info is null
)