助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26836
問題を開く
次の実行結果となるSQL文として正しいものはどれですか。
ただし、実行環境は日本語環境とします。

 ¥500,000.0

正解

SELECT TO_CHAR(500000, 'L999G999D0') FROM dual;

SELECT TO_CHAR(500000.0, 'L999G999D0') FROM dual;

解説

TO_CHAR関数は数値を書式化した文字列に変換します。
設問では、数値を3桁ごとにカンマ(,)で区切り、小数点以下1桁を表示しています。カンマ(,)や小数点(.)は数値書式の中でそのまま用いることができますが、カンマは「G」、小数点は「D」で指定することもできます。なお、数値書式において、カンマを小数点の右側に指定することはできません。
また、¥記号を表示する場合は、ローカル通貨記号の「L」を指定します。

以上より、
・SELECT TO_CHAR(500000, 'L999G999D0') FROM dual;
・SELECT TO_CHAR(500000.0, 'L999G999D0') FROM dual;
が正解となります。

正解のSQL文の実行結果は次のようになります。





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

・SELECT TO_NUMBER('¥500,000.0', 'L999G999D0') FROM dual;
TO_NUMBER関数は、文字列を指定された書式にしたがって数値に変換します。変換された数値は¥やカンマを含むことは出来ないため、誤りです。



・SELECT TO_CHAR('¥500,000.0', 'L999G999D0') FROM dual;
TO_CHAR関数を使用していますが、第1引数には「¥」や「,」が含まれた文字列が指定されているため、エラーとなります。したがって、誤りです。



・SELECT TO_CHAR(500000, 'L999D999G0') FROM dual;
数値書式において、カンマ(G)を小数点(D)の右側に指定することはできないため、エラーとなります。したがって、誤りです。

参考

TO_CHAR関数は、数値や日付値を指定された書式に従って文字列に変換する関数です。
第1引数に数値が指定された場合は、数値を文字列へ変換します。
書式は以下の通りです。

 TO_CHAR(数値 [, '数値書式'] [, NLSパラメータ])

 
 
SQLを表示
SELECT TO_CHAR(1234.567, 'S99999.999')
FROM dual;


数値書式は数値を文字列に変換する際のフォーマットです。数値書式に使用できる主な要素は次のとおりです。



数値書式が省略された場合は、第1引数で指定された数値の有効桁数を保持するために十分な長さの文字列に変換されます。
NLSパラメータを指定すると、小数点文字、桁区切り文字、国際通貨記号、各国通貨記号を指定することができますが、省略された場合は、現在のセッションのデフォルトのパラメータ値が使用されます。

なお、第1引数で指定した数値(小数点より左の整数部)よりも数値書式の桁数が少ない場合など、数値を適切に変換できない場合は、次のように#記号が表示されます。


 
SQLを表示
SELECT TO_CHAR(commission, 'L999,999')
FROM employees;


第1引数で指定した数値の小数点以下は、数値書式の桁を超えていても四捨五入されて正常に表示されます。


また、第1引数の数値にマイナスの値が指定された場合は、数値書式に従って変換された文字列に-符号が適用されます。


 
SQLを表示
SELECT TO_CHAR(-1234.567, '09999.999')
FROM dual;
上に戻る

×である選択肢が誤りである理由

投稿日 2024/02/11

下記問題が×である理由の説明が記載されていないため、ご教授いただきたいです

次の実行結果となるSQL文として正しいものはどれですか。
ただし、実行環境は日本語環境とします。
 ¥500,000.0
〇①SELECTSELECT TO_CHAR(500000.0, 'L999G999D0') FROM dual;
×②SELECT TO_NUMBER('¥500,000.0', 'L999G999D0') FROM dual;
×③SELECT TO_CHAR('¥500,000.0', 'L999G999D0') FROM dual;
×④SELECT TO_CHAR(500000, 'L999D999G0') FROM dual;
〇⑤SELECT TO_CHAR(500000, 'L999G999D0') FROM dual;

④はDとGの位置が違うため
③は数値として「¥」を記載したため
②は理由が分かりませんでした
(¥を記載したため?,文字として¥を記載するのはエラーにならないと思ったのですが…)

2024/02/13 13:24

②は理由が分かりませんでした
(¥を記載したため?,文字として¥を記載するのはエラーにならないと思ったのですが…)

そうですね。第一引数の文字列として¥が含まれていること自体は問題ないので、エラーにもなりませんが、出力結果は期待したものにはなりません。

実際に実行してみると、出力結果は以下のとおり「500000」が出力されます。
TO_NUMBERはNUMBERに変換するので、出力結果として桁区切りのカンマや通貨記号は含まれません。
※第二引数で指定したフォーマットは、第一引数の文字列を数値に変換するにあたり、どう解釈すれば良いかの指定。

SQL> SELECT TO_NUMBER('¥500,000.0', 'L999G999D0') FROM dual;

TO_NUMBER('¥500,000.0','L999G999D0')
------------------------------------
			      500000

下記問題が×である理由の説明が記載されていないため、ご教授いただきたいです

Ping-tさんの問題集はたいてい不正解の選択肢についても説明が載ってるような気がするのですが、確かにこの問題にはないですね...なんででしょう...。


コメント

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

スタッフからの返信

s staff_ishii

2024/02/13 17:45

tkhptw 様、 rink_rew様 ご指摘の点について、解説への加筆・修正を行いました ご報告、誠にありがとうございました。

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