我昨天测试一个东西,遇到了一个数据查询问题,让我非常郁闷与疑惑,非常不解。
问题是这样的,
有一张表叫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转一下就行了。