記事内に広告が含まれています。

【Oracle】NVL2の使い方とNVLとの違い

OracleのNVL2の使い方です。NVLの機能をパワーアップさせた関数です。NVLとの違いも解説します。

【スポンサーリンク】

NVL2とは?

NVL2はNVLの機能をパワーアップさせた関数です。と言っても、NVLから劇的に変わったわけではありません。表にまとめると以下になります。

第1引数がNULL以外の時 第1引数がNULLの時
NVL 第1引数の値を返す 第2引数の値を返す
NVL2 第2引数の値を返す 第3引数の値を返す

ちょっとややこしそうな感じがしますが、そんなに難しくはありません。仕組みもNVLとほぼ同じです。NVLの仕組みについては、過去記事をご覧下さい。

【Oracle】NVLの使い方と仕組み
OracleのNVLの使い方です。
【スポンサーリンク】

NVL2の使い方

NVL2の前に、まずはNVLのおさらいです。NVLは第1引数がNULLの場合は第2引数の値を返します。第1引数がNULL以外の場合は、第1引数の値を返します。例として次の様なSQLを作成しました。

SELECT NVL('NULLじゃないよ','NULLだよ') FROM DUAL
UNION
SELECT NVL(NULL,'NULLだよ') FROM DUAL;

これを実行すると、以下の結果になります。

f:id:neko_britannia:20201014211757j:plain

一方、NVL2は第1引数がNULLの場合は第3引数の値を返します。第1引数がNULL以外の場合は、第2引数の値を返します。ちょっとややこしそうな感じがしますが、実際に実行してみると分かります。NVL2の例のSQLを作りました。

SELECT NVL2('NULLじゃないよ','NOT NULLだよ','NULLだよ') FROM DUAL
UNION
SELECT NVL2(NULL,'NOT NULLだよ','NULLだよ') FROM DUAL;

実行してみましょう。

f:id:neko_britannia:20201014212312j:plain

第1引数に任意の値を渡したNVL2は第2引数の値が返ってきていますね。

実際に使ってみる

まあ、ここまではどこのサイトさんも例文として書いてます。理屈では簡単ですが、「DUALでテスト的にやってるだけで、ようわからん」という人が多いと思います。なので、実際にテーブルを用意して、NVL2を使ってみます。

NVLの時も使った、フルーツのデータが入っているテーブルと、フルーツの色が入っているテーブル(色マスタ)に対してNVL2を使ってみます。テーブルの内容はそれぞれこんな感じ。

f:id:neko_britannia:20201014213508j:plain

f:id:neko_britannia:20201014213649j:plain

2つのテーブルの意味を次の様に定めます。

  • TAB_PRODUCT_FRUIT:フルーツの情報
  • MST_FRUIT_COLOR:フルーツの色
  • TAB_PRODUCT_FRUITのFRUIT_COLOR_CDと、MST_FRUIT_COLORのCOLOR_CODEは紐づいている。

TAB_PRODUCT_FRUITからMST_FRUIT_COLORに対して外部結合して、フルーツの名前とフルーツの色の名前を取得します。

SELECT TAB.NAME AS FRUIT_NAME
      ,MST.COLOR_NAME AS FRUIT_COLOR_NAME
  FROM TAB_PRODUCT_FRUIT TAB
      ,MST_FRUIT_COLOR MST
 WHERE TAB.FRUIT_COLOR_CD = MST.COLOR_CODE(+)

このまま実行すると、TAB_PRODUCT_FRUITとMST_FRUIT_COLORで紐づかない洋ナシの色は取得できません。

f:id:neko_britannia:20201014214226j:plain

そこでNVLとNVL2をそれぞれ使ってみます。まずはNVLから。第1引数の値がNULLなら結果に第2引数の値が表示されます。

SELECT TAB.NAME AS FRUIT_NAME
      ,NVL(MST.COLOR_NAME,'色が存在しません') AS FRUIT_COLOR_NAME
  FROM TAB_PRODUCT_FRUIT TAB
      ,MST_FRUIT_COLOR MST
 WHERE TAB.FRUIT_COLOR_CD = MST.COLOR_CODE(+)
;

f:id:neko_britannia:20201014215051j:plain

次にNVL2を使います。

SELECT TAB.NAME AS FRUIT_NAME
      ,NVL2(MST.COLOR_NAME,'ありますねえ!','ないです') AS FRUIT_COLOR_NAME
  FROM TAB_PRODUCT_FRUIT TAB
      ,MST_FRUIT_COLOR MST
 WHERE TAB.FRUIT_COLOR_CD = MST.COLOR_CODE(+)
;

MST_FRUIT_COLORに値がある場合は「ありますねえ!」、無い場合は「ないです」と返って来ます。実行してみましょう。

f:id:neko_britannia:20201014215405j:plain

NVLでは第1引数がNULL以外の場合、第1引数の値を返してましたが、NVL2では第1引数がNULL以外の場合、第2引数の値を返していることがわかると思います。

【スポンサーリンク】

関連記事

【Oracle】NVLの使い方と仕組み
OracleのNVLの使い方です。
【スポンサーリンク】

参考サイト

NVL2

.