ORACLE的count與空值比較

清風艾艾發表於2016-07-04
  今天,一同事問我,有個問題很奇怪,他寫的SQL語句不統計null值,怎麼一回事,看下面重現:
 參與的實驗資料:
--建立測試表
create table mytab(
col1 varchar2(10),
col2 varchar2(10),
col3 varchar2(10)
);
--插入測試資料
insert into mytab values ('10010','b1','c1');
insert into mytab values ('10011','b2','c2');
insert into mytab values ('10012','b3','c3');
insert into mytab values ('10012','b4','c4');
insert into mytab values ('10012','b4','c5');
insert into mytab values ('10012','b4','c6');
insert into mytab values ('10013','','');
insert into mytab values ('10013','','c7');
insert into mytab values ('10012','','c9');
insert into mytab values ('10012','b9','');

 --同事覺得奇怪的SQL語句及執行結果:
select 'A' as "編號", count(*) from mytab
union
select 'B' as "編號",count(*) from mytab where col2 in('b4','b3')
union 
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3') 
union 
select 'D' as "編號",count(*) from mytab where col2 is null;
查詢結果:
  編號 COUNT(*)
  A     10
  B     4
  C     3
  D     3
 同事覺得編號為C的統計值,應該包含編號為D的統計值,但是,為什麼編號C沒有包括編號D的值呢?
其實,很簡單:
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3')
union 
select 'H' as "編號",count(*) from mytab where col2 != 'b4' and col2 !='b3'
union
select 'I' as "編號",count(*) from mytab where col2 not in('b4','b3') or col2 is null; 
編號 COUNT(*)
 C   3
 H   3
 I    6
編號為C的SQL與編號為H的SQL等價,所以C、H的查詢結果也相同,從編號為I的查詢結果,我們就能發現問題在哪,
就是涉及null的比較,正確方法是:null比較相等用is,比較不等用is not,而不能用=或<>,否則統計將排除空值,有下列SQL語句為證:
select 'C' as "編號",count(*) from mytab where col2 not in('b4','b3') 
union 
select 'D' as "編號",count(*) from mytab where col2 is null
union
select 'E' as "編號", count(*) from mytab where col2 is not null
union
select 'G' as "編號",count(*) from mytab where col2 = null
union
select 'H' as "編號",count(*) from mytab where col2 <> null
union
select 'I' as "編號",count(*) from mytab where col2 not in('b4','b3') or col2 is null; 
編號 COUNT(*)
 C   3
 D   3
 E   7
 G   0
 H   0
 I    6
編號為G和編號為H的查詢結果說明null值使用=或<>進行統計時永遠都為0,只有is 或is not才能統計Null值列名,這是個陷阱。
我想起了,自己JAVA面試的時候,經理就問了這麼一個問題,就是涉及空值的where條件語句怎麼寫,答案的關鍵就是要用is 或
is not進行空值比較。






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2121449/,如需轉載,請註明出處,否則將追究法律責任。

相關文章