関数の使用21 / 50 問

以下のSQL文で、どのような結果が返されますか。

SELECT NVL2(NULLIF(10, 20), 'P', 'Q') AS R1,
       NVL2(NULLIF(10, 10), 'P', 'Q') AS R2
FROM dual;
AR1:P、R2:Q✓
BR1:Q、R2:P
CR1:P、R2:P
DR1:Q、R2:Q
正解:A解説

内側のNULLIFから順に評価します。
使用しているファンクション

ファンクション戻り値
NULLIF(式1, 式2)式1と式2が等しければNULL、異なれば式1
NVL2(式1, 式2, 式3)式1がNULLでなければ式2、NULLであれば式3

R1の評価

  • NULLIF(10, 20)は値が異なるため、10を返します。
  • NVL2(10, 'P', 'Q')は第1引数がNULLではないため、'P'を返します。

R2の評価

  • NULLIF(10, 10)は値が等しいため、NULLを返します。
  • NVL2(NULL, 'P', 'Q')は第1引数がNULLのため、'Q'を返します。
SELECT NVL2(NULLIF(10, 20), 'P', 'Q') AS r1,
       NVL2(NULLIF(10, 10), 'P', 'Q') AS r2
FROM dual;

R1  R2
--- ---
P   Q

NVLは「NULLのときだけ置き換える」のに対し、NVL2は「NULLでないとき」と「NULLのとき」の両方の戻り値を指定できる点が違いです。

前後の問題