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 には、先ず NVL で NULL の値を「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行が選択されました。