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