問題ID: 13539

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2020-12-10 12:43
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 | 投稿日時 2020-12-10 14:10
arashi1977  長老 居住地: 広島  投稿数: 1715
引用:
エラーが出ないはずの選択肢も異なる型を入れようとしているのでエラーになる気がします。

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
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2020-12-10 15:03
arashi1977  長老 居住地: 広島  投稿数: 1715
補足です。
エラーになる選択肢の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行が選択されました。
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2020-12-15 11:35
slachet  新米   投稿数: 4
詳細な解説、返信ありがとうございます。NVL2についてあまりに単純な誤解をしてました。申し訳ありません。
普段なら実機で検証しますが、多忙でその時間が取れなかったため、質問しました。
私が「思います」「気がします」と書いたのは、実際に検証していなかったからであり、私の想像であることを表現するためです。
今回はお手数おかけし、大変申し訳ありませんでした。二度とこのようなことはしません。次回質問する場合は必ず検証いたします。

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.