例えば、2つの数字を足したいけど、1つのパラメータが文字列として保存されてる場合を想像してみて。あるいは、年でデータをフィルタしたいけど、日付が時間付きの完全なフォーマットで保存されてるとか。PostgreSQLはそんなあなたの思惑にあんまり乗り気じゃないから、必要な型にデータを変換するために自分で手を加える必要があるんだ。
型変換が役立つ場面:
- 計算で使うためにデータの扱いをシンプルにする。
- エクスポートや分析のために、もっと読みやすくて構造化されたデータを作る。
- データ型の不一致によるエラーを解消する。
データ型変換の基本:CAST()と::
1. CAST() ― どんな変換にも使えるお兄さん
CAST()関数は、値をあるデータ型から別のデータ型に変換する「公式」な方法。まさに万能な通訳みたいなやつ。
構文:
CAST(値 AS 変換後_データ型)
例1:文字列を数字に変換。
SELECT CAST('123' AS INTEGER); -- 結果: 123
例2:数字を文字列に変換。
SELECT CAST(123 AS TEXT); -- 結果: '123'
例3:日付を文字列に変換。
SELECT CAST(NOW() AS TEXT); -- 結果: '2023-10-25 15:00:00.000000'
2. ::演算子 ― シンプルな代替手段
CAST()がちょっと長ったらしいと感じたら、PostgreSQLには::っていう構文もあるよ。これは短くて人気な変換方法。
構文:
値::変換後_データ型
例1:文字列を数字に変換。
SELECT '123'::INTEGER; -- 結果: 123
例2:数字を文字列に変換。
SELECT 123::TEXT; -- 結果: '123'
例3:日付を文字列に変換。
SELECT NOW()::TEXT; -- 結果: '2023-10-25 15:00:00.000000'
型変換のリアルな使い方例
1. 数字と文字列の変換
例えば、studentsテーブルがあって、student_idカラムが文字列として保存されてるけど、これを数字と比較したい場合。変換しないと何もできないよ。
| student_id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 101 | Alex | Lin | 2008-03-15 | 9 |
| 102 | Maria | Chi | 2009-07-22 | 8 |
| 103 | Axel | Ivy | 2007-11-30 | 10 |
| 104 | Nat | Sok | 2008-01-18 | 9 |
| 105 | Pol | Frez | 2009-05-05 | 8 |
だから、クエリでstudent_idカラムを明示的に数字に変換する必要がある:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
CAST()を使った同じクエリ:
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
日付の変換
日付の一部を取り出したり、文字列に変換したいときも型変換が便利。例えば、coursesテーブルがあって、start_dateカラムにコース開始日が入ってるとする。
| course_id | course_name | start_date |
|---|---|---|
| 1 | Python入門 | 2025-01-15 |
| 2 | SQLの基礎 | 2025-03-01 |
| 3 | データ分析 | 2025-05-10 |
| 4 | Web開発 | 2025-06-20 |
| 5 | 機械学習 | 2025-09-05 |
例:年を数字として取り出す。
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
結果はこんな感じ:
| start_date (DATE) | start_date (TEXT) | start_date (TIMESTAMP) |
|---|---|---|
| 2025-01-15 | 2025-01-15 | 2025-01-15 00:00:00 |
| 2025-03-01 | 2025-03-01 | 2025-03-01 00:00:00 |
| 2025-05-10 | 2025-05-10 | 2025-05-10 00:00:00 |
| 2025-06-20 | 2025-06-20 | 2025-06-20 00:00:00 |
| 2025-09-05 | 2025-09-05 | 2025-09-05 00:00:00 |
例:日付を「ピュアな文字列」に変換。
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
結果はこんな感じ:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
エラー:変換がうまくいかないときは?
データ変換のトリックはいつも上手くいくわけじゃない。時々、PostgreSQLが「それは分からん!」ってはっきり教えてくれる。よくある例:数字っぽいテキストを数字に変換しようとしたけど、余計な文字が混じってる場合。
エラー例:
SELECT '123abc'::INTEGER;
-- エラー: integer型への変換で無効な入力構文: "123abc"
こういう問題を避けるには、データが本当に変換できるか事前にチェックしよう。例えば、正規表現や追加のチェックを使うといいよ。
GO TO FULL VERSION