助け合いフォーラム
ただし、実行環境は日本語環境とします。
¥500,000.0
正解
SELECT TO_CHAR(500000, 'L999G999D0') FROM dual;
SELECT TO_CHAR(500000.0, 'L999G999D0') FROM dual;
解説
設問では、数値を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)の右側に指定することはできないため、エラーとなります。したがって、誤りです。
参考
第1引数に数値が指定された場合は、数値を文字列へ変換します。
書式は以下の通りです。
TO_CHAR(数値 [, '数値書式'] [, NLSパラメータ])
FROM dual;
数値書式は数値を文字列に変換する際のフォーマットです。数値書式に使用できる主な要素は次のとおりです。
数値書式が省略された場合は、第1引数で指定された数値の有効桁数を保持するために十分な長さの文字列に変換されます。
NLSパラメータを指定すると、小数点文字、桁区切り文字、国際通貨記号、各国通貨記号を指定することができますが、省略された場合は、現在のセッションのデフォルトのパラメータ値が使用されます。
なお、第1引数で指定した数値(小数点より左の整数部)よりも数値書式の桁数が少ない場合など、数値を適切に変換できない場合は、次のように#記号が表示されます。
FROM employees;
第1引数で指定した数値の小数点以下は、数値書式の桁を超えていても四捨五入されて正常に表示されます。
また、第1引数の数値にマイナスの値が指定された場合は、数値書式に従って変換された文字列に-符号が適用されます。
FROM dual;
×である選択肢が誤りである理由
下記問題が×である理由の説明が記載されていないため、ご教授いただきたいです
次の実行結果となる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の位置が違うため
③は数値として「¥」を記載したため
②は理由が分かりませんでした
(¥を記載したため?,文字として¥を記載するのはエラーにならないと思ったのですが…)
②は理由が分かりませんでした
(¥を記載したため?,文字として¥を記載するのはエラーにならないと思ったのですが…)
そうですね。第一引数の文字列として¥が含まれていること自体は問題ないので、エラーにもなりませんが、出力結果は期待したものにはなりません。
実際に実行してみると、出力結果は以下のとおり「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様 ご指摘の点について、解説への加筆・修正を行いました ご報告、誠にありがとうございました。