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 売上金額
  FROM TM_得意先 TM, TT_売上 TH, TT_売上明細 TD
  WHERE TM.得意先コード = TH.得意先コード(+)
  AND   TH.売上番号 = TD.売上番号(+)
  GROUP BY TM.得意先コード
  ORDER BY TM.得意先コード;
 
得意先コード   売上金額
------------ ----------
           1    1514000
           2     560000
           3     396000
           4     570000
           5     696000
           6          0
 
6行が選択されました。

share


本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。