データベースのテーブルにはそれぞれのカラムにデータ型が定義されていますが、実際にデータとして取得する際、格納されたデータ型とは異なる型で取得したいことも少なくありません。
そこで本記事では、SQLでデータ型を変換するために利用される「CAST関数」と「CONVERT関数」について、基本的な使い方をご紹介していきたいと思います。
目次
SQLでデータ型を変換する方法とは
SQLでデータ型を変換する際、「CAST関数」と「CONVERT関数」を利用することが可能です。
どちらも取得したデータ型を任意の型に変換する関数で、記述方法がそれぞれ少し異なります。
また指定可能なデータ型は下記のいずれかとなりますので、確認しておきましょう。
- BINARY
- CHAR
- NCHAR
- DATE
- DATETIME
- TIME
- DECIMAL
- JSON
- SIGNED
- UNSIGNED
SQLでデータ型を変換する方法1: CAST関数
まずはCAST関数を利用して、SQLでのデータ型変換について確認していきましょう。
基本構文
CAST関数を利用する場合、下記のように記述します。
SELECT CAST(値 as 変換後のデータ型);
サンプル
では実際に各種データ型を指定して、サンプルで動作を確認してみましょう。
BINARY
整数値に対してBINARY型へ変換するサンプルです。
mysql> SELECT CAST(1 as BINARY); +--------------------------------------+ | CAST(1 as BINARY) | +--------------------------------------+ | 0x31 | +--------------------------------------+ 1 row in set (0.00 sec)
数値からBINARY形式へ変換されていることをご確認いただけます。
CHAR
続いて整数値に対して5桁の文字数指定でCHAR型に変換するサンプルです。
mysql> SELECT CAST(123456789 as CHAR(5)); +----------------------------+ | CAST(123456789 as CHAR(5)) | +----------------------------+ | 12345 | +----------------------------+ 1 row in set, 1 warning (0.01 sec)
指定した桁数で表示されていることをご確認いただけます。
NCHAR
文字列を3桁までの文字数指定でNCHAR型に変換するサンプルです。
mysql> SELECT CAST('アイウエオ' as NCHAR(3)); +-------------------------------------+ | CAST('アイウエオ' as NCHAR(3)) | +-------------------------------------+ | アイウ | +-------------------------------------+ 1 row in set, 2 warnings (0.00 sec)
指定した文字数で表示されていることをご確認いただけます。
DATE
日付型に変換出来るような数値をDATE型へ変換するサンプルです。
mysql> SELECT CAST(20201013 as DATE); +------------------------+ | CAST(20201013 as DATE) | +------------------------+ | 2020-10-13 | +------------------------+ 1 row in set (0.01 sec)
DATE型にフォーマットされた状態で表示されていることをご確認いただけます。
DATETIME
上記のDATE型サンプルで利用した数値をDATETIME型に変換したサンプルです。
mysql> SELECT CAST(20201013 as DATETIME); +----------------------------+ | CAST(20201013 as DATETIME) | +----------------------------+ | 2020-10-13 00:00:00 | +----------------------------+ 1 row in set (0.00 sec)
時刻が追加された状態でフォーマットされていることをご確認いただけます。
TIME
今度は時刻のフォーマットに変換可能な6桁の数値をTIME型に変換するサンプルです。
mysql> SELECT CAST(123025 as TIME); +----------------------+ | CAST(123025 as TIME) | +----------------------+ | 12:30:25 | +----------------------+ 1 row in set (0.00 sec)
時刻フォーマットに変換されていることをご確認いただけます。
DECIMAL
数値文字列を小数点第一位までの5桁のDECIMAL型に変換するサンプルです。
mysql> SELECT CAST("2000.15" as DECIMAL(5, 1)); +----------------------------------+ | CAST("2000.15" as DECIMAL(5, 1)) | +----------------------------------+ | 2000.2 | +----------------------------------+ 1 row in set (0.00 sec)
小数点第二位が四捨五入されて表示されているのをご確認いただけます。
JSON
文字列をJSON型に変換した上で、「JSON_EXTRACT」関数を利用して「name」に設定された値を抽出するサンプルです。
mysql> SELECT JSON_EXTRACT(CAST('{"name": "テスト1", "name2": "テスト2"}' as JSON),"$.name"); +--------------------------------------------------------------------------------------+ | JSON_EXTRACT(CAST('{"name": "テスト1", "name2": "テスト2"}' as JSON),"$.name") | +--------------------------------------------------------------------------------------+ | "テスト1" | +--------------------------------------------------------------------------------------+ 1 row in set (0.01 sec)
「name」に設定された値である「テスト1」が表示されていることをご確認いただけます。
SIGNED
小数点付きの数値を符号付き整数値のSIGNEDに変換するサンプルです。
mysql> SELECT CAST(1.2 as SIGNED); +---------------------+ | CAST(1.2 as SIGNED) | +---------------------+ | 1 | +---------------------+ 1 row in set (0.00 sec)
小数点の値が切り捨てられ、整数値として表示されていることをご確認いただけます。
UNSIGNED
小数点付きの数値を符号なし整数値のUNSIGNEDに変換するサンプルです。
mysql> SELECT CAST(1.2 as UNSIGNED); +-----------------------+ | CAST(1.2 as UNSIGNED) | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec)
ちなみにUNSIGNEDに変換する値をマイナスの値で指定すると、下記のように意図しない数値で変換されるため注意が必要です。
mysql> SELECT CAST(-1.2 as UNSIGNED); +------------------------+ | CAST(-1.2 as UNSIGNED) | +------------------------+ | 18446744073709551615 | +------------------------+ 1 row in set (0.00 sec)
SQLでデータ型を変換する方法2: CONVERT関数
SQLでデータ型を変換する方法の2つ目であるCONVERT関数についても確認していきましょう。
基本構文
CONVERT関数を利用する場合、下記のように記述します。
SELECT CONVERT(値, 変換後のデータ型);
サンプル
ではCONVERT関数を利用したデータ型の変換についてもサンプルで確認していきましょう。
サンプルで指定する値はCAST関数と同様のものを利用しますので、実行結果だけを掲載していきます。
BINARY
mysql> SELECT CONVERT(1, BINARY); +------------------------------------------+ | CONVERT(1, BINARY) | +------------------------------------------+ | 0x31 | +------------------------------------------+ 1 row in set (0.00 sec)
CHAR
mysql> SELECT CONVERT(123456789, CHAR(5)); +------------------------------+ | CONVERT(123456789, CHAR(5)) | +------------------------------+ | 12345 | +------------------------------+ 1 row in set, 1 warning (0.00 sec)
NCHAR
mysql> SELECT CONVERT('アイウエオ', NCHAR(3)); +---------------------------------------+ | CONVERT('アイウエオ', NCHAR(3)) | +---------------------------------------+ | アイウ | +---------------------------------------+ 1 row in set, 2 warnings (0.00 sec)
DATE
mysql> SELECT CONVERT(20201013, DATE); +-------------------------+ | CONVERT(20201013, DATE) | +-------------------------+ | 2020-10-13 | +-------------------------+ 1 row in set (0.00 sec)
DATETIME
mysql> SELECT CONVERT(20201013, DATETIME); +-----------------------------+ | CONVERT(20201013, DATETIME) | +-----------------------------+ | 2020-10-13 00:00:00 | +-----------------------------+ 1 row in set (0.00 sec)
TIME
mysql> SELECT CONVERT(123025, TIME); +------------------------+ | CONVERT(123025, TIME) | +------------------------+ | 12:30:25 | +------------------------+ 1 row in set (0.00 sec)
DECIMAL
mysql> SELECT CONVERT("2000.15", DECIMAL(5, 1)); +-----------------------------------+ | CONVERT("2000.15", DECIMAL(5, 1)) | +-----------------------------------+ | 2000.2 | +-----------------------------------+ 1 row in set (0.00 sec)
JSON
mysql> SELECT JSON_EXTRACT(CONVERT('{"name": "テスト1", "name2": "テスト2"}', JSON),"$.name"); +---------------------------------------------------------------------------------------+ | JSON_EXTRACT(CONVERT('{"name": "テスト1", "name2": "テスト2"}', JSON),"$.name") | +---------------------------------------------------------------------------------------+ | "テスト1" | +---------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
SIGNED
mysql> SELECT CONVERT(1.2, SIGNED); +----------------------+ | CONVERT(1.2, SIGNED) | +----------------------+ | 1 | +----------------------+ 1 row in set (0.00 sec)
UNSIGNED
mysql> SELECT CONVERT(1.2, UNSIGNED); +-------------------------+ | CONVERT(1.2, UNSIGNED) | +-------------------------+ | 1 | +-------------------------+ 1 row in set (0.00 sec)
さいごに:SQLではデータ取得の際に型の変換が可能!
本記事では、SQLでデータ型の変換に利用されるCAST関数とCONVERT関数の基本的な使い方についてご紹介してきました。
記述方法が異なるだけで、ほとんど同じ動作をする関数ではありますが、SQL標準の関数として認められているのは「CAST関数」です。
各種データベースでの利用を想定する場合、基本的にはCAST関数を利用し、CONVERT関数でしか対応できない変換のみCONVERT関数を利用することをおすすめします。
記事内で紹介するサンプルはMySQLデータベースを利用したものです。
データベース毎に利用可能な関数は異なるため、ご利用のデータベースで提供されている関数に読み替えてご利用ください。