問題ID: 13539
- フォーラムは新サイトへ移行しました。
- このフォーラムではゲスト投稿が禁止されています
問題ID: 13539
msg# 1
slachet
投稿数: 4
Oracle Bronze SQL 12cより
エラーが出ないはずの選択肢も異なる型を入れようとしているのでエラーになる気がします。
1. SELECT NVL2(salary, salary, 0) FROM employees;
2. SELECT NVL2(commission, commission, 'none') FROM employees;
3. SELECT employee_name, NVL2(yomi, yomi, 'none') FROM employees;
4. SELECT NVL2(commission, 'setting', 'none') FROM employees;
2. が正解となっていますが、4. も正解だと思います。
エラーが出ないはずの選択肢も異なる型を入れようとしているのでエラーになる気がします。
1. SELECT NVL2(salary, salary, 0) FROM employees;
2. SELECT NVL2(commission, commission, 'none') FROM employees;
3. SELECT employee_name, NVL2(yomi, yomi, 'none') FROM employees;
4. SELECT NVL2(commission, 'setting', 'none') FROM employees;
2. が正解となっていますが、4. も正解だと思います。
Re: 問題ID: 13539
msg# 1.1
arashi1977
居住地: 広島
投稿数: 1715
引用:「気がします」、「と思います」と言われても、実際そうなるのですが…
この問題では「NVL2(第1引数, 第2引数, 第3引数)」という関数の挙動についてのものですが、エラーになるものでは
・行の「第1引数:commission列の値」をチェックし、
・NULLではない→第2引数である、行の「commission列」の値を返す
・NULLである→第3引数(ここでは文字列none)を返す
を期待しているのですが、第2引数(commission列)はNUMBER型、であり'none'は文字列なので一致せずエラーになる(ORA-01722: 数値が無効です。)というものです。
で、slachetさんの想定される4は「NVL2(commission, 'setting', 'none')」となっており
・行の「第1引数:commission列の値」をチェックし、
・NULLではない→第2引数である'setting'という文字列を返す
・NULLである→第3引数である'none'という文字列を返す
なので、第2引数と第3引数は型が同じなので問題なく実行される、ということです。
実際に動作検証して確認するのがおすすめですよ。
エラーが出ないはずの選択肢も異なる型を入れようとしているのでエラーになる気がします。
2. が正解となっていますが、4. も正解だと思います。
# sqlplus pingt/oracle@XE
SQL*Plus: Release 11.2.0.2.0 Production on 木 12月 10 13:59:35 2020
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> SELECT NVL2(commission, 'setting', 'none') FROM employees;
NVL2(CO
-------
setting
setting
setting
setting
setting
setting
setting
setting
setting
setting
setting
NVL2(CO
-------
setting
setting
setting
setting
setting
none
none
none
none
none
none
22行が選択されました。
SQL> SELECT NVL2(commission, commission, 'none') FROM employees;
SELECT NVL2(commission, commission, 'none') FROM employees
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。
この問題では「NVL2(第1引数, 第2引数, 第3引数)」という関数の挙動についてのものですが、エラーになるものでは
・行の「第1引数:commission列の値」をチェックし、
・NULLではない→第2引数である、行の「commission列」の値を返す
・NULLである→第3引数(ここでは文字列none)を返す
を期待しているのですが、第2引数(commission列)はNUMBER型、であり'none'は文字列なので一致せずエラーになる(ORA-01722: 数値が無効です。)というものです。
で、slachetさんの想定される4は「NVL2(commission, 'setting', 'none')」となっており
・行の「第1引数:commission列の値」をチェックし、
・NULLではない→第2引数である'setting'という文字列を返す
・NULLである→第3引数である'none'という文字列を返す
なので、第2引数と第3引数は型が同じなので問題なく実行される、ということです。
実際に動作検証して確認するのがおすすめですよ。
Re: 問題ID: 13539
msg# 1.1.1
arashi1977
居住地: 広島
投稿数: 1715
補足です。
エラーになる選択肢のSQLでも、NVL2関数の第3引数を文字列から数字にすると問題なく実行できます。
エラーになる選択肢のSQLでも、NVL2関数の第3引数を文字列から数字にすると問題なく実行できます。
SQL> SELECT NVL2(commission, commission, 0) from employees; ←第3引数を「0」にしてみる
NVL2(COMMISSION,COMMISSION,0)
-----------------------------
2000000
2000000
2000000
2000000
2000000
5000000
5000000
1500000
1500000
1200000
1000000
NVL2(COMMISSION,COMMISSION,0)
-----------------------------
800000
800000
800000
800000
800000
0
0
0
0
0
0
22行が選択されました。
Re: Re: 問題ID: 13539
msg# 1.1.1.1
slachet
投稿数: 4
詳細な解説、返信ありがとうございます。NVL2についてあまりに単純な誤解をしてました。申し訳ありません。
普段なら実機で検証しますが、多忙でその時間が取れなかったため、質問しました。
私が「思います」「気がします」と書いたのは、実際に検証していなかったからであり、私の想像であることを表現するためです。
今回はお手数おかけし、大変申し訳ありませんでした。二度とこのようなことはしません。次回質問する場合は必ず検証いたします。
普段なら実機で検証しますが、多忙でその時間が取れなかったため、質問しました。
私が「思います」「気がします」と書いたのは、実際に検証していなかったからであり、私の想像であることを表現するためです。
今回はお手数おかけし、大変申し訳ありませんでした。二度とこのようなことはしません。次回質問する場合は必ず検証いたします。