SQLのcastについてまとめています。
SQLのcastの構文
cast( 値 as データ型)という構文で型の変換が可能です。
下記は、emp_no(社員番号)とbirth_date(誕生日)をCHAR型に変換し、concatで文字列として連結した例です。
SELECT Concat(Cast(emp_no AS CHAR), Cast(birth_date AS CHAR), Cast(hire_date AS CHAR)) FROM employees LIMIT 10; +---------------------------------------------------------------------------------+ | concat(cast(emp_no as char), cast(birth_date as char), cast(hire_date as char)) | +---------------------------------------------------------------------------------+ | 100011953-09-021986-06-26 | | 100021964-06-021985-11-21 | | 100031959-12-031986-08-28 | | 100041954-05-011986-12-01 | | 100051955-01-211989-09-12 | | 100061953-04-201989-06-02 | | 100071957-05-231989-02-10 | | 100081958-02-191994-09-15 | | 100091952-04-191985-02-18 | | 100101963-06-011989-08-24 | +---------------------------------------------------------------------------------+ 10 rows in set (0.01 sec)
【関連記事】
▶SQL castはデータ型の明示的な変換 データベースによって、オプションに差異あり
なお、castで変換可能なデータ型は以下の通りです。データベース管理ソフトによって、多少の差異があります。
- BINARY[(N)]
- CHAR[(N)]
- DATE
- DATETIME
- DECIMAL[(M[,D])]
- SIGNED [INTEGER]
- TIME
- UNSIGNED [INTEGER]
SQL castの使い方
日付を数値に変換する
日付(date型)を数値に変換するとどうなるのか見てみましょう。下記のように、日付の数値がそのままハイフン(-)を除いた形で数値化されました。
mysql> select birth_date, cast(birth_date as decimal) from employees limit 10; +------------+-----------------------------+ | birth_date | cast(birth_date as decimal) | +------------+-----------------------------+ | 1953-09-02 | 19530902 | | 1964-06-02 | 19640602 | | 1959-12-03 | 19591203 | | 1954-05-01 | 19540501 | | 1955-01-21 | 19550121 | | 1953-04-20 | 19530420 | | 1957-05-23 | 19570523 | | 1958-02-19 | 19580219 | | 1952-04-19 | 19520419 | | 1963-06-01 | 19630601 | +------------+-----------------------------+ 10 rows in set (0.00 sec)
上記の例はdecimalですが、signed、unsignedでも同様です。
下記は、emp_no、birth_date、hire_dateをそれぞれ数値に変換して足し算した例です。
mysql> select cast(emp_no as unsigned) + cast(birth_date as unsigned) + cast(hire_date as unsigned) from employees limit 10; +---------------------------------------------------------------------------------------+ | cast(emp_no as unsigned) + cast(birth_date as unsigned) + cast(hire_date as unsigned) | +---------------------------------------------------------------------------------------+ | 39401529 | | 39501725 | | 39462034 | | 39411706 | | 39451038 | | 39431028 | | 39470740 | | 39531142 | | 39380646 | | 39531435 | +---------------------------------------------------------------------------------------+ 10 rows in set (0.00 sec)
数字以外の文字列を数値にcastすると0になる
mysql> select cast("abc" as unsigned ); +--------------------------+ | cast("abc" as unsigned ) | +--------------------------+ | 0 | +--------------------------+ 1 row in set, 1 warning (0.00 sec)
数値以外の文字列を数値にcastすると、0となります。上記の例絵は、abcという文字列をunsigned(符号なし整数)にcastした結果です。
ちなみに-1の場合は、signedの場合は-1に、unsignedの場合は補数表記になります。
mysql> select cast("-1" as unsigned ); +-------------------------+ | cast("-1" as unsigned ) | +-------------------------+ | 18446744073709551615 | +-------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> select cast("-1" as signed ); +-----------------------+ | cast("-1" as signed ) | +-----------------------+ | -1 | +-----------------------+ 1 row in set (0.00 sec)
まとめ
- castはデータ型を変換する関数
- データを数値に変換すると四則演算が、文字列に変換すると連結などの文字列操作が可能
- 数字以外の文字列を数値に変換すると0になる。