sum(nvl(a,b))とnvl(sum(a),b)の違い

857 ワード

通常、すべてのローのデータが空でない場合:
select sum(nvl(1,1)) from dual ;
select nvl(sum(1),1) from dual ;

結果は同じです.
 
すべてのロー・データが空の場合:
select sum(nvl(null,1)) from dual ;
select nvl(sum(null),1) from dual ;

結果も同じです.
 
データが検出されない場合:
select sum(nvl(1,1)) from dual where 1<>1;
select nvl(sum(1),1) from dual where 1<>1;
select sum(nvl(null,1)) from dual where 1<>1;
select nvl(sum(null),1) from dual where 1<>1;

sumは中と外で結果が違うことがわかります.sumは外で、結果は空で、sumは中で結果は1です
これはsumとnvlの異常処理が異なるためである.
データの処理中にnullではないデータがない場合、sumは「空」を返し、nvlは「データがない」を返します.
したがって、sumが外にいる場合、nvlはまず「データがない」を返し、sumは「データがない」を処理し、結果は「空」を返す.
sumが中に入っている場合、sumはまず「データなし」を処理し、戻り結果は「空」、nvlはnvlを処理し、戻り結果は1となる.