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; |
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; |
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.売上番号(+) |
本書用のWebアプリを使ってSQLを実行し学習していきます。初心者の方に分かりやすく、図表を多く使って解説されています。 学習の最後には200問越えのドリルが付いていてSQLのスキルが試せる様になっています。