CASTを使うとデータ型を変更することができます。
英単語のCASTの意味を調べると「割り振る・配役する・役をつける・・」などの日本語訳がされていました。
テレビなどでは配役のことをキャストと言ったりしますよね。
SQL文におけるCASTも同じように捉えることができます。
「役」が「データ型」というイメージでしょうか。
同じ「1」でも数値型の場合と文字列型の場合がありますが、数値から文字列に変換するなどのデータ型の変更にCASTを使用します。
1. データ型とCAST
SQLでデータを扱う際、否応なしにデータ型を意識させられることがあります。
例えば文字列の結合で思わぬエラーになる、日付の計算をしたいがデータが文字列型だったので計算できない、JOINの結合条件でデータ型が異なり結合できないなどなど・・
そのような時に使用できるのがCAST関数です。
ここではCASTの使い方について初心者向けに解説します。
1-1 データ型について
データ型には主に次のようなものがあります。
• 数値型 (INTEGERやFLOAT 等)
• 文字列型 (VARCHARやTEXT等)
• 日付型 (DATEやDATETIME 等)
四則演算は数値型のデータで使用できます。
日付型のデータも年数、日数などの期間を計算したり条件指定をすることができます。
またデータのソートをする際に文字列型と数値型ではソートされる順序が異なります。
ここではデータ型について細かい解説はしませんが他にもたくさんの種類があり、使用するデータベースによって記述方法や使える型が異なる場合があります。
詳細については「データベース名 データ型」(例 MySQLデータ型)などでWeb検索してみてください。
1-2 CASTとは適切なデータ型に変換する処理
適切なデータ型を使用することは大切ですが、実はわざわざ変換を行わなくともデータベースが気を遣って自動的に型変換をしてくれる場合があります。(暗黙的型変換)
ですが、思わぬ結果やエラーを招いてしまうことがあるため注意が必要です。
きちんとデータ型を合わせておいた方が良いでしょう。
とはいえ、データベースに登録されているデータのデータ型を簡単に変更することはできません。
そこでCASTを利用してSQL文の中で明示的に型変換をおこないます。
他にも型変換ができる関数としてCONVERT がありますが、本記事ではCASTにフォーカスして解説します。
2. CASTの構文
CASTの構文
CAST(変換したいカラムまたは値 AS データ型)
例)CAST(‘2025-03-09’ AS DATE)
変換できないデータの場合(ひらがなを数値にしようとした など)エラーになります。
3. CASTの使いどころ
次はCASTの使いどころについて見ていきます。
3-1 どのような時にCASTを使うのか
CASTでデータ型の変更ができることはここまで説明してきた通りですが、実際にはどのような時に型変換が必要になるのか具体例をいくつかご紹介します。
(1) 文字列として登録されている日付を日付型に変換してSELECTしたい
(2) 数値型で登録されている数値を文字列として扱いたい
(3) 文字列型の数字をソートしたら想定と異なる順序にソートされてしまった。番号順に並べたい。
3-2 具体的な使用例
このセクションでは上記 (1)から(3) のケースで具体的なサンプルコードを見ていきます。
(1) 文字列として登録されている日付を日付型に変換してSELECTしたい
下表Employeesテーブルは1行目がカラム名、2行目はデータ型を示しています。
同じ表のなかで入社日[Date of Employment]はDate型ですが、退職日[Retirement date]が文字列型(Varchar)となっているため、データ型を揃えた状態でSELECTするSQL文を記述してみます。
Employees
EmpID | EmpName | BUnit | EmpRole | Date_of_Employment | Retirement_date |
int | Varchar | Varchar | Varchar | Date | Varchar |
100001 | 江洲 久得 | 本部 | 代表取締役社長 | 1958/3/10 | 2014/1/8 |
100230 | 江洲 久江留 | 本部 | 代表取締役社長 | 1976/8/28 | 2018/3/3 |
100005 | 経理 一郎 | 経理部 | 部長 | 1958/3/10 | 2000/5/3 |
101707 | 営業 次郎 | 営業部 | 部長 | 1988/10/30 | 1995/12/3 |
SELECT EmpID, EmpName, BUnit, EmpRole, Date_of_Employment, Retirement_date, CAST(Retirement_date as date) as conversion FROM Employees;
実行結果:
(4) 文字列型の数字をソートしたら、想定と異なる順序にソートされてしまったので番号順に並べたい
conversion カラムが変換後の値です。
SELECT文には[Retirement_date]を残したままにしてあります。この表ではデータ型まではわかりませんが比べていただくと表示スタイルが変わっていることが確認できると思います。
(2) 数値型で登録されている数値を文字列として扱いたい
先程の表 Employeesの EmpIDに、退職者であることが判別できるようIDの後ろに「(退)」という文字列を結合してみたいと思います。
まず、EmpIDの int型(数値型)を文字列型に変換してみます。
SELECT EmpID, CAST(EmpID AS CHAR) AS EmpID_string, EmpName, BUnit, EmpRole, Date_of_Employment, CAST(Retirement_date AS DATE) AS conversion FROM Employees;
実行結果:
EmpID_string 列は EmpIDとは違い、左寄せになりました。
それでは文字列を結合する関数[CONCAT]を使用してIDの右側に「(退)」の文字を結合します。
退職者だけに文字を追加したいのでWHERE文で Retirement_date がNULLでないという条件を追加します。(元々リストには退職された方しかおられませんが・・)
SELECT CONCAT(CAST(EmpID AS CHAR) , '(退)') AS EmpID_string, EmpName, BUnit, EmpRole, Date_of_Employment, CAST(Retirement_date AS DATE) AS conversion FROM Employees WHERE Retirement_date IS NOT NULL;
実行結果:
*このサンプルは暗黙的変換によりCASTをしなくても結合することが可能です。
(MySQL8.0にて確認)
(3) 文字列型の数字をソートしたら想定と異なる順序にソートされてしまった。番号順に並べたい。
次のようなテーブルがあります。データ型は VARCHAR です。
NumberString |
1.0 |
10.0 |
2.0 |
21.0 |
文字列型として保存されている数字をソート(ORDER BY)すると次のような結果になります。
ほとんどの場合これは意図したソート結果ではないでしょう。
それでは [NumberString] を数値型にCASTしてからソートしてみます。
SELECT NumberString FROM SampleTable ORDER BY CAST(NumberString AS FLOAT);
小数データのためFLOAT型に変換します。
想定通りにソートすることができました。
まとめ
以上、型変換をおこなう CAST について解説いたしました。
最後までお読みいただきましてありがとうございました。
【参考サイト】
12.11 キャスト関数と演算子
CAST および CONVERT (Transact-SQL) – SQL Server | Microsoft Docs
データ型の変換 (データベース エンジン) – SQL Server | Microsoft Learn
【動作検証DB】
mySQL 8.0.39