問題:對(duì)某列進(jìn)行聚集運(yùn)算,但該列的值可為空,由于函數(shù)會(huì)忽略NULL值,能否保持聚集運(yùn)算的準(zhǔn)確性令人擔(dān)憂。例如,想要求DEPTNO 30中職員的平均傭金,但有些職員不掙傭金(這些職員的COMM值為NULL)。由于聚集運(yùn)算會(huì)忽略NULL,因此輸出結(jié)果的準(zhǔn)確性沒有保障。在進(jìn)行聚集運(yùn)算時(shí)有時(shí)可能需要以某種方式將NULL值包括進(jìn)來。
解決方案
使用COALESCE函數(shù)把NULL轉(zhuǎn)換為0,這樣在進(jìn)行聚集時(shí)可以把它們包括進(jìn)來:
1 select avg(coalesce(comm,0)) as avg_comm
2 from emp
3 where deptno=30
討論
請(qǐng)務(wù)必記住,在使用聚集函數(shù)時(shí)會(huì)忽略NULL。不使用COALESCE函數(shù)時(shí)該解決方案的輸出如下:
select avg(comm)
from emp
where deptno=30
AVG(COMM)
---------
550
該查詢表明,DEPTNO 30的平均傭金是550,快速檢查這些行如下:
select ename, comm
from emp
where deptno=30
order by comm desc
ENAME COMM
---------- ---------
BLAKE
JAMES
MARTIN 1400
WARD 500
ALLEN 300
TURNER 0
這表明六個(gè)職員中只有四個(gè)職員掙得傭金。DEPTNO 30中所有傭金的總和是2200,其平均值應(yīng)該是2200/6,而不是2200/4。如果不用COALESCE函數(shù),回答的是問題“DEPTNO 30中掙得傭金的職員的平均傭金是多少?”,而不是“DEPTNO 30中所有職員的平均傭金是多少?”。使用聚集時(shí)記住要相應(yīng)處理NULL值。