以下の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のとき」の両方の戻り値を指定できる点が違いです。