問題:對某列進行聚集運算,但該列的值可為空,由于函數會忽略NULL值,能否保持聚集運算的準確性令人擔憂。例如,想要求DEPTNO 30中職員的平均傭金,但有些職員不掙傭金(這些職員的COMM值為NULL)。由于聚集運算會忽略NULL,因此輸出結果的準確性沒有保障。在進行聚集運算時有時可能需要以某種方式將NULL值包括進來。
解決方案
使用COALESCE函數把NULL轉換為0,這樣在進行聚集時可以把它們包括進來:
1 select avg(coalesce(comm,0)) as avg_comm
2 from emp
3 where deptno=30
討論
請務必記住,在使用聚集函數時會忽略NULL。不使用COALESCE函數時該解決方案的輸出如下:
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
這表明六個職員中只有四個職員掙得傭金。DEPTNO 30中所有傭金的總和是2200,其平均值應該是2200/6,而不是2200/4。如果不用COALESCE函數,回答的是問題“DEPTNO 30中掙得傭金的職員的平均傭金是多少?”,而不是“DEPTNO 30中所有職員的平均傭金是多少?”。使用聚集時記住要相應處理NULL值。