助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26678
問題を開く
COALESCE関数の説明として正しいものはどれですか(該当するものを全て選択して下さい)。
正解
引数の値を判定し、最初に見つかったNULL値以外の値を返す
引数に指定するデータは、すべて同じデータ型でなければならない
解説
COALESCE関数は引数の値を判定し、最初に見つかったNULL値以外の値を返す関数です
なお、COALESCE関数の引数は、すべて同じデータ型の値でなければなりません。異なるデータ型の値を指定するとエラーとなります(暗黙的なデータ変換は行われません)。
以上より、
・引数の値を判定し、最初に見つかったNULL値以外の値を返す
・引数に指定するデータは、すべて同じデータ型でなければならない
が正解となります。
その他の選択肢については次のとおりです。
・引数のデータ型は、暗黙的なデータ変換が行われるので、引数に異なるデータ型を指定できる
暗黙的なデータ変換は行われません。引数に異なるデータ型の値を指定するとエラーとなります。
・すべての引数がNULLだった場合は0を返す
・引数には1つ以上のNULL値以外のデータを指定しなければならない
すべての引数がNULL値の場合、COALESCE関数はNULL値を返します。
なお、COALESCE関数の引数は、すべて同じデータ型の値でなければなりません。異なるデータ型の値を指定するとエラーとなります(暗黙的なデータ変換は行われません)。
以上より、
・引数の値を判定し、最初に見つかったNULL値以外の値を返す
・引数に指定するデータは、すべて同じデータ型でなければならない
が正解となります。
その他の選択肢については次のとおりです。
・引数のデータ型は、暗黙的なデータ変換が行われるので、引数に異なるデータ型を指定できる
暗黙的なデータ変換は行われません。引数に異なるデータ型の値を指定するとエラーとなります。
・すべての引数がNULLだった場合は0を返す
・引数には1つ以上のNULL値以外のデータを指定しなければならない
すべての引数がNULL値の場合、COALESCE関数はNULL値を返します。
参考
NULL値を扱う汎用関数には次の関数があります。
[NVL関数]
NVL関数は値がNULL値であった場合に、別の値を返す関数です。
使用法は以下の通りです。
NVL(式1, 式2)
第1引数の値がNULL値の場合、第2引数の値を返します。第1引数の値がNULL値でなければ、そのまま第1引数の値を返します。

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

[NVL2関数]
NVL2関数は値がNULL値か否かを調べ、NULL値以外の場合は値A、NULL値の場合は値Bを返す関数です。
使用法は以下の通りです。
NVL2(式1, 式2, 式3)
第1引数の値がNULL値以外の場合、第2引数の値を返します。
第1引数の値がNULL値の場合、第3引数の値を返します。

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

[NULLIF関数]
NULLIF関数は2つの値を比較して、等しい場合にNULLを返す関数です。
使用法は以下の通りです。
NULLIF(式1, 式2)
第1引数と第2引数が等しい場合はNULL値を、等しくない場合は第1引数の値を返します。

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

上記のように第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値を返します。

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

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

SQLを表示
SELECT NVL2(commission, commission, 'none')
FROM employees;
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;
FROM employees;
なお、第1引数にはリテラルのNULL値以外の値を指定しなければなりません。

SQLを表示
SELECT NULLIF(NULL, 'database')
FROM dual;
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(commission, salary, employee_id)
FROM employees
WHERE employee_id >= 1016;
なお、COALESCE関数の引数は、すべて同じデータ型の値でなければなりません。異なるデータ型の値を指定するとエラーとなります(暗黙的なデータ変換は行われません)。

SQLを表示
SELECT COALESCE(employee_id, employee_name, hiredate)
FROM employees;
FROM employees;
COALESCE関数は暗黙的な変換可能であればできるはず。
k
kawa0914
投稿日 2025/12/04
↓Oracle公式より引用
すべてのexprが数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型である場合、Oracle Databaseは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。
r
rink_rew
2025/12/08 20:06
Oracleデータベースとしては様々な場面で暗黙的なデータ型変換をしてくれますが、本問題の「参考」に示されているように、COALESCE関数では、すべての引数は同じデータ型でなければならないため、異なるデータ型の値を指定すると基本的にエラーとなります。
SQL> desc test_coalesce01
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COL1 NUMBER
COL2 VARCHAR2(20)
SQL> SELECT * FROM test_coalesce01;
COL1 COL2
---------- --------------------
10 100
SQL> SELECT COALESCE(col1, col2) FROM test_coalesce01;
SELECT COALESCE(col1, col2) FROM test_coalesce01
*
行1でエラーが発生しました。:
ORA-00932: データ型が一致しません: NUMBERが予想されましたがCHARです。
もちろん、明示的に変換すればエラーにはなりません。
SQL> SELECT COALESCE(to_char(col1), col2) FROM test_coalesce01;
COALESCE(TO_CHAR(COL1),COL2)
----------------------------------------
10
SQL> SELECT COALESCE(col1, to_number(col2)) FROM test_coalesce01;
COALESCE(COL1,TO_NUMBER(COL2))
------------------------------
10
SQL>
公式マニュアルに記載の文章については、文字->数値や日付->文字のような、よく言う暗黙的データ変換ではなく、同じ数値<->数値や日付<->日付での処理を指しているようです。
DATE型とTIMESTAMP型で試して見たら、型は異なりますがエラーにならずに結果が返されました。
SQL> desc test_coalesce_conv01
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COL1 TIMESTAMP(6)
COL2 DATE
SQL> SELECT * FROM test_coalesce_conv01;
COL1
---------------------------------------------------------------------------
COL2
--------
25-12-08 05:59:08.325928
25-01-01
SQL> SELECT COALESCE(col1, col2) FROM test_coalesce_conv01;
COALESCE(COL1,COL2)
---------------------------------------------------------------------------
25-12-08 05:59:08.325928
SQL>
コメント
この投稿に対して返信しませんか?