SQLのFORMAT(フォーマット)についてまとめてます。
SQLのFORMATの構文
SQLのformatは、データを見やすく整形します。ただし、標準SQLではないため、DBMSによって実装が異なっています。
以下は、MySQLで、salary(数値。年収、ドル)を小数点2位まで表示し、カンマ区切りで整形する例です。
mysql> select emp_no, format( salary, 2 ) from salaries limit 10; +--------+---------------------+ | emp_no | format( salary, 2 ) | +--------+---------------------+ | 10001 | 60,117.00 | | 10001 | 62,102.00 | | 10001 | 66,074.00 | | 10001 | 66,596.00 | | 10001 | 66,961.00 | | 10001 | 71,046.00 | | 10001 | 74,333.00 | | 10001 | 75,286.00 | | 10001 | 75,994.00 | | 10001 | 76,884.00 | +--------+---------------------+ 10 rows in set (0.00 sec)
また、MySQLでは日付や時間に対しては、date_format関数が用意されていて、フォーマット文字列に従ってフォーマットが可能です。下記の例では、birth_date(誕生日)をYYYY/MM/DD形式で抽出しています。
mysql> select emp_no, date_format(birth_date, '%Y/%m/%d'), first_name, last_name from employees limit 10; +--------+-------------------------------------+------------+-----------+ | emp_no | date_format(birth_date, '%Y/%m/%d') | first_name | last_name | +--------+-------------------------------------+------------+-----------+ | 10001 | 1953/09/02 | Georgi | Facello | | 10002 | 1964/06/02 | Bezalel | Simmel | | 10003 | 1959/12/03 | Parto | Bamford | | 10004 | 1954/05/01 | Chirstian | Koblick | | 10005 | 1955/01/21 | Kyoichi | Maliniak | | 10006 | 1953/04/20 | Anneke | Preusig | | 10007 | 1957/05/23 | Tzvetan | Zielinski | | 10008 | 1958/02/19 | Saniya | Kalloufi | | 10009 | 1952/04/19 | Sumant | Peac | | 10010 | 1963/06/01 | Duangkaew | Piveteau | +--------+-------------------------------------+------------+-----------+ 10 rows in set (0.00 sec)
【関連記事】
▶【MySQL】SQLの各種フォーマット関数を試してみよう【数値・日付・文字列】
なお、データ単体ではなく、CSV化など複数のデータをまとめて希望の形式にフォーマットしたい場合は、group_concatなどを使う方法があります。
【関連記事】
▶SQLでカンマ区切りを扱うサンプルコード集 formatやCSV、group_concatの例
MySQLのformat
MySQLでは、formatやdate_formatでデータのフォーマットが可能です。
mysql> select emp_no, date_format(birth_date, '%Y/%m/%d'), first_name, last_name from employees limit 10; +--------+-------------------------------------+------------+-----------+ | emp_no | date_format(birth_date, '%Y/%m/%d') | first_name | last_name | +--------+-------------------------------------+------------+-----------+ | 10001 | 1953/09/02 | Georgi | Facello | | 10002 | 1964/06/02 | Bezalel | Simmel | : :
以下は、デフォルト形式でselectした例です。birth_dateが「YYYY-MM-DD」形式になっています。
mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQLの日付フォーマットを把握しよう!データ型と変換方法について
Oracleのformat
Oracleでは、データのフォーマットはTO_CHAR関数を使用します。
SELECT TO_CHAR(1234567,'FM999G999G999') FROM DUAL 結果 ---------------- 1,234,567
フォーマット文字列を指定して、数値、日付、時刻などを整形して文字列に変換するんですね。全てのデータがTO_CHARでフォーマットできるので、使い勝手はシンプルで良いと思います。
【関連記事】
▶TO_CHAR関数の使い方を解説!SQLで数値や日付を書式を指定して文字列に変換
SQL Serverのformat
SQL Serverのformatは、日付、時刻、数値のフォーマットをおこないます。(SQL Server 2014以降)
DECLARE @d DATE = GETDATE(); SELECT FORMAT( @d, 'dd/MM/yyyy', 'en-US' ) AS 'Date' ,FORMAT(123456789,'###-##-####') AS 'Custom Number'; Date Custom Number ---------- ------------- 22/11/2020 123-45-6789
SQL Serverの第三引数は、国ごとの表記の仕方(カルチャー)を指定します。単純なカンマ区切りだけではなく、自由なカスタム書式が設定可能です。
参考)FORMAT (Transact-SQL) – SQL Server | Microsoft Docs
PostgreSQLのformat
PostgreSQLでは、to_char関数によって、タイムスタンプ、時間間隔、数値のフォーマッティングが可能です。
関連)PostgreSQL公式:データ型フォーマッティング関数
使い勝手としては、Oracleに近いですね。フォーマット文字列で指定した以上の桁が指定されると、#表示になります。
dvdrental=# select to_char(148.5,'999D999'); to_char ---------- 148.500 (1 row) dvdrental=# select to_char(3148.5,'9G999D999'); to_char ------------ 3,148.500 (1 row)
まとめ
- SQLのformatは、データを指定形式にフォーマットする関数
- formatはDBMSによって実装が異なる
- CSV形式化など複数のデータをフォーマットするには、group_concatなどを使用する方法がある