助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26680
問題を開く
SQL関数の結果として正しいものはどれですか。

正解

NVL('sato', NULL)の結果は"sato"である

解説

NVL関数は、第1引数の値がNULL値以外の場合は第1引数の値を返し、NULL値の場合は第2引数の値を返します。
NVL2関数は、第1引数の値がNULL値以外の場合は第2引数の値を返し、NULL値の場合は第3引数の値を返します。
NULLIF関数は、第1引数と第2引数の値を比較して、等しい場合はNULL値を、等しくない場合は第1引数を返します。
COALESCE関数は、引数の値を判定し、最初に見つかったNULL値以外の値を返します。

以上より、
・NVL('sato', NULL)の結果は"sato"である
が正解となります。

正解のNVL関数の実行結果は次のようになります。


 
SQLを表示
SELECT NVL('sato', NULL)
FROM dual;


その他の選択肢については次のとおりです。

・NVL2(NULL, 'sato', 'yamada')の結果は"sato"である
NVL2関数は第1引数の値がNULL値の場合、第3引数の値を返します。


 
SQLを表示
SELECT NVL2(NULL, 'sato', 'yamada')
FROM dual;


・NULLIF('sato', 'yamada')はエラーとなる
NULLIF関数は2つの引数の値を比較して、異なる場合は第1引数の値を返します。


 
SQLを表示
SELECT NULLIF('sato', 'yamada')
FROM dual;


・COALESCE('2012-05-10', 0, 'sato', NULL)の結果はNULLである
COALESCE関数に指定する引数は、すべて同じデータ型の値を指定しなければなりません。


 
SQLを表示
SELECT COALESCE('2012-05-10', 0, 'sato', NULL)
FROM dual;

参考

NULL値を扱う汎用関数には次の関数があります。

[NVL関数]
NVL関数は値がNULL値であった場合に、別の値を返す関数です。
使用法は以下の通りです。

 NVL(式1, 式2)

第1引数の値がNULL値の場合、第2引数の値を返します。第1引数の値がNULL値でなければ、そのまま第1引数の値を返します。

 
 
SQLを表示
SELECT employee_id, employee_name, salary
FROM employees
WHERE employee_id IN (1017, 1018, 1019);

SELECT employee_id, employee_name, NVL(salary, 0)
FROM employees
WHERE employee_id IN (1017, 1018, 1019);


ただし、第2引数に指定する式は、第1引数のデータ型と同じデータ型でなければなりません(暗黙的なデータ変換が行われる場合はエラーとなりません)。異なるデータ型を返す式を指定するとエラーとなります。


 
SQLを表示
SELECT NVL(manager_id, 'none')
FROM employees;


[NVL2関数]
NVL2関数は値がNULL値か否かを調べ、NULL値以外の場合は値A、NULL値の場合は値Bを返す関数です。
使用法は以下の通りです。

 NVL2(式1, 式2, 式3)

第1引数の値がNULL値以外の場合、第2引数の値を返します。
第1引数の値がNULL値の場合、第3引数の値を返します。

 
 
SQLを表示
SELECT salary, NVL2(salary, 1, 0)
FROM employees;


ただし、第2引数と第3引数は同じデータ型でなければなりません(暗黙的なデータ変換が行われる場合はエラーとなりません)。異なるデータ型を返す式を指定するとエラーとなります。


 
SQLを表示
SELECT NVL2(commission, commission, 'none')
FROM employees;


[NULLIF関数]
NULLIF関数は2つの値を比較して、等しい場合にNULLを返す関数です。
使用法は以下の通りです。

 NULLIF(式1, 式2)

第1引数と第2引数が等しい場合はNULL値を、等しくない場合は第1引数の値を返します。

 
 
SQLを表示
SELECT employee_name, salary, commission, NULLIF(salary, commission/4)
FROM employees;


なお、第1引数にはリテラルのNULL値以外の値を指定しなければなりません。


 
SQLを表示
SELECT NULLIF(NULL, 'database')
FROM dual;


上記のように第1引数にリテラルのNULL値は指定できませんが、第1引数で指定した列の値などが結果としてNULL値となる場合は問題ありません。
第1引数が結果としてNULL値となる場合は、第2引数がいかなる値であっても、NULL値が返されます。(第2引数がNULL値であれば等しいのでNULL値、第2引数がNULL値以外であれば等しくないので第1引数のNULL値が返される為)

[COALESCE関数]
COALESCE関数は引数の値を判定し、最初に見つかったNULL値以外の値を返す関数です。
使用法は以下の通りです。

 COALESCE(式1, 式2 [, 式3 ...])

引数に指定された式全てがNULL値の場合、COALESCE関数はNULL値を返します。

 
 
SQLを表示
SELECT commission, salary, employee_id,
COALESCE(commission, salary, employee_id)
FROM employees
WHERE employee_id >= 1016;


なお、COALESCE関数の引数は、すべて同じデータ型の値でなければなりません。異なるデータ型の値を指定するとエラーとなります(暗黙的なデータ変換は行われません)。


 
SQLを表示
SELECT COALESCE(employee_id, employee_name, hiredate)
FROM employees;
上に戻る

型の変換について

投稿日 2025/12/08

・COALESCE('2012-05-10', 0, 'sato', NULL)の結果はNULLである
COALESCE関数に指定する引数は、すべて同じデータ型の値を指定しなければなりません。

この場合、第2引数の0が文字列の'0'に暗黙的型変換されて'2012-05-10'が結果として返ると思ったのですが違うのでしょうか?

2025/12/09 20:12

ちょうど類似の投稿があったので私も調べて見たのですが、本問題でも説明されているように、COALESCE関数ではすべての引数は同じデータ型でなければならず、実行例のとおりエラーになります。
https://mondai.ping-t.com/g/posts/2173

ちなみに黒本(オラクルマスター教科書)などの記載も同様で「引数は同じデータ型である必要がある」という記載になってますね。


コメント

M MagiMagi_110

2025/12/10 09:43

なるほど NVL関数など他の関数では暗黙的型変換が行われることが多いので混同しちゃってました... 「COALESCE関数は特殊で型変換されない」という認識で覚える方がいいですかね。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?