SQL SERVER2005 使用与!= 查询结果不一样的问题

时间:2020-12-06 00:48:57


我昨天测试一个东西,遇到了一个数据查询问题,让我非常郁闷与疑惑,非常不解。

问题是这样的,

有一张表叫STB,里面有1000条数据,有三个字段,分别为主键“机顶盒ID(STB_ID)”,“机顶盒条形码(STB_BAR_CODE)”,“机顶盒状态(STB_STATUS)”。

主键为identity(1,1)。条码与状态均为varchar类型。状态里只有1、2、3、4四种值。


--A 查询所有机顶盒为HS开头与00010开头的,一共有860个。

 select count(stb_id) from stb where stb_bar_code  like 'HS%'  or stb_bar_code like '00010%'

--A1 查询所有机顶盒为HS开头与00010开头的, 机顶盒状态等于2的,有620个。

select count(stb_id) from stb where (stb_bar_code  like '%HS%'  or stb_bar_code like '%00010%') and stb_status = 2

--A2 查询所有机顶盒为HS开头与00010开头的,机顶盒状态不等于2的,按理说应该有860-620=240个,但结果确是238个,少了两个,哪去了?

select count(stb_id) from stb where (stb_bar_code  like '%HS%'  or stb_bar_code like '%00010%') and stb_status <> 2

非常不解啊,找了半天,终于找到原因了。


------------------------------------------------------------------------------------------------------------------------------------------------------------------

只有找出A里面没有包含A1,A2的机顶盒才能知道原因了,所以想了一个很傻的办法去左联查询。

select s1.stb_id,s1.stb_bar_code,s3.stb_bar_code,s5.stb_bar_code from (
	select * from stb s where stb_bar_code  like 'HS%'  or stb_bar_code like '00010%'
) as s1 
left join (
select s2.* from (
	select * from stb where (stb_bar_code  like '%HS%'  or stb_bar_code like '%00010%') and stb_status <> 2
) as s2 ) as s3
on s1.stb_id = s3.stb_id
left join (
	select s4.* from (
		select * from stb where (stb_bar_code  like '%HS%'  or stb_bar_code like '%00010%') and stb_status = 2
	) as s4 ) as s5
on s1.stb_id = s5.stb_id 
where (s1.stb_bar_code  like '%HS%'  or s1.stb_bar_code like '%00010%') and s3.stb_bar_code is null and s5.stb_bar_code is null order by s1.stb_bar_code

以上左联将<>2与=2均没有的数据查出来,果然有这2个。

问题找到了,原来是有些机顶盒状态为NULL,其中SQL中NULL值不能用<>与!=比较,这样结果是出不来的。

解决方式很简单,查询的时候将NULL转一下就行了。