Oracle SQL 関数 : TO_CHAR(数値) : 数値を文字列へ変換
stringRet := TO_CHAR( numberSrc [ , stringFormat [ , nlsParam ] ] ); TO_CHARは数値データnumberSrcを日付書式stringFormatに従ってVARCHAR2型のデータを返します。 stringFormatを指定しない場合はデフォルトの日付書式に従います。 nlsParamは月、日の名称及び略称の言語を指定します。
通常の処理でよく使用する書式文字を記します。
日付書式文字 | 変換内容 |
---|---|
,(カンマ) | 指定した位置にカンマを返す |
.(ピリオド) | 指定した位置に小数点を返す(書式の中で1個のみ指定) |
0 | 先行0を返します |
9 | 正の値の場合は先頭空白を埋め込み、負の場合には負の記号を先頭に埋め込んで指定の桁数にして返す |
S | 負の値は(-)を、正の値は(+)を前に付ける。(Sが先頭に在る場合) |
FM | 前後に空白を付けずに返す |
SQL> SELECT ('''' || TO_CHAR(12345.6789,'999,999.999') || '''') fm1, 2 ('''' || TO_CHAR(12345.6789,'099,999.9999') || '''') fm2, 3 ('''' || TO_CHAR(12345.6789,'FM999,999.999') || '''') fm3, 4 ('''' || TO_CHAR(12345.6789,'FM099,999.9999') || '''') fm4, 5 ('''' || TO_CHAR(-12345.6789,'999,999.999') || '''') fm5, 6 ('''' || TO_CHAR(-12345.6789,'099,999.9999') || '''') fm6, 7 ('''' || TO_CHAR(-12345.6789,'S999,999.999') || '''') fm7, 8 ('''' || TO_CHAR(-12345.6789,'S099,999.9999') || '''') fm8, 9 ('''' || TO_CHAR(-12345.6789,'999,999.999S') || '''') fm9, 10 ('''' || TO_CHAR(-12345.6789,'099,999.9999S') || '''') fm10, 11 ('''' || TO_CHAR(12345.6789,'$999,999.999') || '''') fm11, 12 ('''' || TO_CHAR(12345.6789,'$099,999.9999') || '''') fm12 13 FROM DUAL; FM1 FM2 FM3 FM4 FM5 FM6 -------------- --------------- -------------- --------------- -------------- --------------- FM7 FM8 FM9 FM10 FM11 FM12 -------------- --------------- -------------- --------------- --------------- ---------------- ' 12,345.679' ' 012,345.6789' '12,345.679' '012,345.6789' ' -12,345.679' '-012,345.6789' ' -12,345.679' '-012,345.6789' ' 12,345.679-' '012,345.6789-' ' $12,345.679' ' $012,345.6789'
尚、数値が指定桁数より大きい場合には桁数分だけ"#"が返される為、指定桁数は十分な桁数が必要です。
指定桁数より小さい数値の場合は空白が埋められ桁数分の文字列が表示されます。
SQL> SELECT TO_CHAR(123456789,'99,999,999') FMT8, 2 TO_CHAR(123456789,'999,999,999') FMT9, 3 TO_CHAR(1234567 ,'999,999,999') FMT9_2 FROM DUAL; FMT8 FMT9 FMT9_2 ---------------------- ------------------------ ------------------------ ########### 123,456,789 1,234,567
コードとして使用している数値項目を「先頭0付き」で表示させたい場合は以下の様にします。
(上の例では説明が足りない様な気がしましたので、ここで改めて示します。)
SQL> SELECT 2 TO_CHAR(123,'FM099') AS "3桁先頭0" 3 ,TO_CHAR(123,'FM0999') AS "4桁先頭0" 4 ,TO_CHAR(123,'FM09999') AS "5桁先頭0" 5 ,TO_CHAR(123,'FM099999') AS "6桁先頭0" 6 FROM DUAL; 3桁先頭0 4桁先頭0 5桁先頭0 6桁先頭0 -------- ---------- ------------ -------------- 123 0123 00123 000123
「'FM099'」の「99」の部分を LPAD 関数を使って置き換えます。
SQL> SELECT 2 TO_CHAR(123,'FM0' || LPAD('9', 2, '9')) AS "3桁先頭0" 3 ,TO_CHAR(123,'FM0' || LPAD('9', 3, '9')) AS "4桁先頭0" 4 ,TO_CHAR(123,'FM0' || LPAD('9', 4, '9')) AS "5桁先頭0" 5 ,TO_CHAR(123,'FM0' || LPAD('9', 5, '9')) AS "6桁先頭0" 6 FROM DUAL; 3桁先頭0 4桁先頭0 5桁先頭0 6桁先頭0 -------- ---------- ------------ -------------- 123 0123 00123 000123
LPAD 関数の中の桁数指定を変化させれば汎用的に使えると思います。
参考までに、この処理を関数化してみましたので、以下に示します。
SQL> CREATE OR REPLACE FUNCTION NUM_PREZERO ( 2 InNum IN NUMBER 3 ,InUnit IN NUMBER 4 ) 5 RETURN VARCHAR2 6 IS 7 UnitWk NUMBER; 8 BEGIN 9 UnitWk := InUnit; 10 IF UnitWk <= 1 THEN 11 UnitWk := 1; 12 END IF; 13 RETURN TO_CHAR(InNum, 'FM0' || LPAD('9', UnitWk - 1, '9')); 14 END; 15 / ファンクションが作成されました。 SQL> SELECT 2 NUM_PREZERO(1, 1) || ' / ' || 3 NUM_PREZERO(1, 3) || ' / ' || 4 NUM_PREZERO(123, 5) || ' / ' || 5 NUM_PREZERO(123456, 9) 6 FROM DUAL; NUM_PREZERO(1,1)||'/'||NUM_PREZERO(1,3)||'/'||NUM_PREZERO(123,5)||'/'||NUM_PREZE -------------------------------------------------------------------------------- 1 / 001 / 00123 / 000123456