SQLの文字列の数値変換についてまとめています。
MySQLのサンプルデータベースEmployeesを使用しています。
SQLの文字列を数値に変換する方法と、ゼロ詰めフォーマット

主要なデータベース(Oracle、MySQL、SQL Server、PostgreSQL)では、手動で文字列を数値に変換する必要はありません。
たとえば、数字の1と文字列の’1’を足し算すると、自動的に型変換が行われます。※以下はMySQLでの実行例です。
mysql> select 1+'1'; +-------+ | 1+'1' | +-------+ | 2 | +-------+ 1 row in set (0.00 sec)
Oracleでも、同様に自動的に型変換が行われます。
※Oracleでの実行例 select 1+'1' from dual; 1+'1' ----- 2
文字列を関数の引数に指定する場合でも、変換は不要です。employees(社員)テーブルのemp_noは、int型で、emp_no-10000もint型になりますが、文字列を連結する関数concatの引数にそのまま使用してもエラーにはなりません。
mysql> select concat("No.",emp_no-10000), first_name, last_name from employees limit 10;
+----------------------------+------------+-----------+
| concat("No.",emp_no-10000) | first_name | last_name |
+----------------------------+------------+-----------+
| No.1 | Georgi | Facello |
| No.2 | Bezalel | Simmel |
| No.3 | Parto | Bamford |
| No.4 | Chirstian | Koblick |
| No.5 | Kyoichi | Maliniak |
| No.6 | Anneke | Preusig |
| No.7 | Tzvetan | Zielinski |
| No.8 | Saniya | Kalloufi |
| No.9 | Sumant | Peac |
| No.10 | Duangkaew | Piveteau |
+----------------------------+------------+-----------+
10 rows in set (0.00 sec)
例外として、桁数の多い高精度数値で計算を行いたい場合など、明示的にTO_NUMBER(Oracleの場合)などの文字列→数値変換関数で、変換をおこなうケースもあります。
select TO_NUMBER('10.5') from dual;
TO_NUMBER('10.5')
-----
10.5
数値を文字列に変換する場合、フォーマット文字列を指定することでゼロ詰めフォーマットをおこなうことができます。以下はPostgreSQlでの例です。
123を0999というフォーマット文字列でフォーマットすると0123となります。0または9で数値をそのまま表示します。ただし、0が指定されている桁がゼロだった場合、0を表示します。
postgres=# select to_char(123, '0999'); to_char --------- 0123 (1 row)
フォーマット文字に0を指定した場合と、9を指定した場合の具体的な例を見てみましょう。
postgres=# select to_char(100,'999');
to_char
---------
100
(1 row)
postgres=# select to_char(100,'000');
to_char
---------
100
(1 row)
postgres=# select to_char(0.1,'999.9');
to_char
---------
.1
(1 row)
postgres=# select to_char(0.1,'990.9');
to_char
---------
0.1
(1 row)
ゼロ詰めのほか、小数表示の整数部がゼロだった場合にゼロを表示したい場合にも、フォーマット文字0が使われます。
以下は1、100、1000にフォーマット文字000を指定した例です。桁が足りない場合は0詰めされます。桁があふれた場合、結果は###と、最大桁数ぶんの#が並べられます。
postgres=# select to_char(1, '000'); to_char --------- 001 (1 row) postgres=# select to_char(100, '000'); to_char --------- 100 (1 row) postgres=# select to_char(1000, '000'); to_char --------- ### (1 row)
なお、to_charでは正数が指定された場合、符号を表示するための桁が空白となります。空白を入れたくない場合は、フォーマット文字にFMを指定します。
postgres=# select concat('#',to_char(-100, '000'),'#');
concat
--------
#-100#
(1 row)
postgres=# select concat('#',to_char(100, '000'),'#');
concat
--------
# 100#
(1 row)
postgres=# select concat('#',to_char(100, 'FM000'),'#');
concat
--------
#100#
(1 row)
MySQLには、to_charという関数がありません。そのため、ゼロ詰めしたい場合は、lpadという関数を使います。
mysql> select lpad(1, 4, '0'); +-----------------+ | lpad(1, 4, '0') | +-----------------+ | 0001 | +-----------------+ 1 row in set (0.00 sec)
SQLでの0埋めにはlpad ゼロパディングのサンプルコード集 | 「ポテパンスタイル」
まとめ


- SQLで数値から文字列に変換する場合は、変換処理は不要
- ただし、高精度の数値として扱いたい場合や、ゼロ詰めなどフォーマットしたい場合は、to_numberやto_charなどで変換する
- MySQLなど、to_charが用意されていないデーターベースでは、lpadを使って数値のフォーマットをおこなう