Oracle SQL 関数 : NVL, NVL2 : NULLデータ置換え

 dataRet := NVL( dataSrc , dataChg );

 NVLはデータdataSrcがNULLの場合、dataChgを結果として返し、NULLで無い場合は
 dataSrcそのものを返します。 戻り値のデータ型はdataSrcのデータ型と同じになります。
SQL> SELECT NVL(NULL,'IS NULL') , NVL('123','IS NULL') FROM DUAL;

NVL(NUL NVL
------- ---
IS NULL 123
 dataRet := NVL2( dataSrc , dataNotNull, dataNull );

 NVL2はデータdataSrcがNULLの場合dataNullを結果として返し、NULL以外の場合dataNotNullを返します。
 dataNotNullと dataNullのデータ型が異なりdataNullがNULLで無い場合にはdataNullをdataNotNullの
 データ型に変換します。
 戻り値のデータ型はdataNotNullのデータ型と同じになります。
 dataNotNullが文字列型の場合はVRACHAR2型になります。
SQL> SELECT NVL2(NULL,'IS NOT NULL','IS NULL') , NVL2('123','IS NOT NULL','IS NULL') FROM DUAL;

NVL2(NU NVL2('123',
------- -----------
IS NULL IS NOT NULL


SUM 関数のところで同じ内容を記述していますが、 NULL が返される可能性があるデータに対する SUM には、先ず NVLNULL の値を「0」にしてやります。

以下の例では「TT_売上」及び「TT_売上明細」より得意先毎の売上金額を集計しています。 この場合、「売上数量」×「売上単価」の値がNULLの場合があるので NVL 関数の処理を行っています。

SQL> SELECT SELECT TM.得意先コード, SUM(NVL(TD.売上数量 * TD.売上単価, 0)) AS 売上金額
  2  FROM TM_得意先 TM, TT_売上 TH, TT_売上明細 TD
  3  WHERE TM.得意先コード = TH.得意先コード(+)
  4  AND   TH.売上番号 = TD.売上番号(+)
  5  GROUP BY TM.得意先コード
  6  ORDER BY TM.得意先コード;

得意先コード   売上金額
------------ ----------
           1    1514000
           2     560000
           3     396000
           4     570000
           5     696000
           6          0

6行が選択されました。