TO_CHAR関数は、Oracleデータベースなどで、数値や日付型のデータを文字列に変換する関数です。
文字列への変換を行うTO_CHAR関数は、例えば数値をゼロ埋めしたり、日付を”2020/08/20″などのスラッシュ付きで編集したり、SQL文を作成する時によく使用する関数です。
この記事ではTO_CHAR関数の使い方を詳しく解説します。TO_CHAR関数は、RDB(リレーショナルデータベース)ごとに使い方に違いがあるため、RDB別に使い方を解説していきます。
TO_CHAR関数の構文
まずは、TOCHAR関数の構文を確認していきましょう。
この記事では、OracleデータベースのTOCHAR`関数をベースに解説していきます。
構文
OracleのTO_CHAR関数の構文と引数は次の通りです。
TO_CHAR ( expr [, format [, nls_param]] )
引数
引数 | 説明 |
---|---|
expr | 数値や日付値など、文字列に変換する値を指定します。 |
format | 変換する書式(※後述参照) |
nls_param | NLS_CURRENCYなどのNLSパラメータ |
#### 数値を書式付きで文字列に変換する
構文を確認したところで、TO_CHAR関数を使ったサンプルコードを見ていきましょう。
まずは、数値を書式付きで文字列に変換する方法を解説します。
【カンマ区切りの文字列に変換】
最初は、数値型の値を3桁ごとにカンマ区切りの文字列に変換する例です。
SELECT TO_CHAR(1234567,'FM999,999,999') FROM DUAL
結果
----------------
1,234,567
書式Gでも同じように区切り文字を挿入できます。
SELECT TO_CHAR(1234567,'FM999G999G999') FROM DUAL
結果
----------------
1,234,567
数値が書式で指定した桁数よりも大きい場合(オーバーフロー)、結果はすべて”#”になります。
SELECT TO_CHAR(1234567890,'FM999G999G999') FROM DUAL
結果
----------------
#########
【数値をゼロ埋めする】
“100”を”00100″など、ゼロを数値の左側に挿入する、いわゆる「ゼロ埋め」の方法についても見ていきましょう。ゼロ埋めは、書式に”0″を指定すると、指定した桁に数値が存在しない場合は、0で埋められた状態で編集されます。
SELECT TO_CHAR(100, '00000') FROM DUAL
結果
----------------
00100
数値書式
上記で紹介した方法以外にも、さまざな数値書式があります。次の表は、OracleデータベースのTO_CHAR関数で指定可能な数値書式モデルの一覧です。
書式 | 説明 |
---|---|
カンマ(,) | 指定の位置にカンマを挿入します。 |
G | 指定の位置にNLSNUMERICCHARACTERパラーメータで指定された桁区切り文字を挿入します。 |
ドット(.) | 指定の位置に小数点記号を挿入します。 |
D | 指定の位置にNLSNUMERICCHARACTERパラーメータで指定された小数点記号を挿入します。 |
0 | 先行ゼロに対して’0’を戻します。(ゼロ埋め) |
9 | 指定された桁数の値を戻します。(ゼロ埋めしない) |
B | 整数部が0(ゼロ)の場合、書式モデル内の0(ゼロ)にかかわらず、固定小数点数の整数部に対して空白を戻します。 |
C | NLSISOCURRENCYパラーメータで指定された通貨記号を挿入します。 |
EEEE | 科学表記(指数表記) |
L | NLS_CURRENCYパラーメータで指定されたローカル通貨記号を挿入します。 |
〜MI | 負の値の後に負の符号(-)を戻します。 正の値の後に空白を戻します。 |
〜PR | 山カッコ\の中に負の値を戻します。 正の値の前後に空白を付けて戻します。 |
RN(rn) | 大文字(小文字)のローマ数字で戻します。 |
S9999 | 数字の先頭に符号(+/-)を戻します。 |
TM | テキストの最小数値書式モデル。文字の最小数を戻します。 |
TM9 | デフォルトの書式。64文字までは固定表記で、65文字以上は”E”などの科学表記 |
V | 値に 10 の n 乗を掛けて戻す。Vの後ろの9の数だけ乗じる。 |
X | 16進数表記を戻す。 |
日付型の値を書式付きで文字列に変換する
数値の変換の次は、日付型の値を書式付きで文字列に変換する方法を解説します。
【スラッシュやコロンで日付や時刻を区切る】
日付型の値を画面などに表示する場合、2020/08/20 12:00:00のように、スラッシュやコロンで日付や時刻の各項目を区切るのが一般的です。
TO_CHAR関数で上記のように日付を書式付き文字列に変換する時は、次のように記述します。
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') FROM DUAL
結果
----------------
2020/08/20 12:00:00
【曜日を取得する】
TO_CHAR関数の書式に「DAY」を指定すると、曜日を取得できます。
SELECT TO_CHAR(SYSDATE,'Day') FROM DUAL
結果
----------------
金曜日
言語を指定して曜日を取得する場合は、TO_CHAR関数の第3引数に言語を指定します。
SELECT TO_CHAR(SYSDATE, 'Day', 'NLS_DATE_LANGUAGE = ENGLISH') FROM DUAL
結果
----------------
Friday
日付書式
上記で紹介した方法以外にも、さまざな日付書式があります。次の表は、OracleデータベースのTO_CHAR関数で指定可能な日付書式モデルの抜粋です。(紀元(AD)など、一般的に使われない日付書式は省略しています)
書式 | 説明 |
---|---|
E | 時代名の略号。(M = 明治,T = 大正,S = 昭和,H = 平成,R = 令和) |
EE | 時代名の名称。(明治、対象、昭和、平成、令和) |
YYYY | 4桁の西暦 |
RR | 2桁の西暦(OracleはYYYYの使用を推奨している) |
Q | 四半期を表す数値。(1-3月= 1、4-6月= 2、7-9月= 3、10~12月= 4) |
MM | 月2桁 (00〜12) |
MON | 月の短縮名を返す。(Jan, Feb, Mar, …) |
MONTH | 月の名前を返す。(January, February, March, …) |
DY | 曜日の短縮名を返す。(月〜日) |
DAY | 曜日名を返す。(月曜日〜日曜日) |
DD | 日2桁 (00〜31) |
AM/PM | 午前または午後を返す |
HH (HH12) | 12時間表示の時間(00〜12) AM/PM書式と組み合わせて使うのが一般的 |
HH24 | 24時間表示の時間 (00〜24) |
MI | 分 (00〜59) |
SS | 秒 (00〜59) |
FF… | ミリ秒・ナノ秒(Fの文字数に応じて精度が上がる) |
TZR | タイムゾーンの地域名 |
TZD | タイムゾーン 省略名 |
TZH | タイムゾーン オフセット(時) |
TZM | タイムゾーン オフセット(分) |
SQL Server、MySQLではTO_CHAR関数は使えない
注意しなければならないのが、TO_CHAR関数はすべてのデータベースで使用できる関数ではありません。
「SQL Server」の場合、数値や日付の変換にはCONVERT関数を使用します。「MySQL」の場合では、数値を書式付きで変換する場合はFORMAT関数を使用し、日付の場合はDATE_FORMATやTIME_FORMAT関数を使用します。
TO_CHAR関数をマスターして、数値・日付を変換しよう
「Oracle」「PostgreSQL」などのデータベースで使えるTO_CHAR関数の使い方について解説してきました。
TO_CHAR関数は、SQL文の中でも頻繁に使用する関数です。この機会に是非覚えて自在に数値や日付型の値を文字列に変換する方法をマスターしましょう。