CodeGym /コース /SQL SELF /CAST()と::によるデータ型変換 ― 例とポイント

CAST()と::によるデータ型変換 ― 例とポイント

SQL SELF
レベル 5 , レッスン 3
使用可能

例えば、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"

こういう問題を避けるには、データが本当に変換できるか事前にチェックしよう。例えば、正規表現や追加のチェックを使うといいよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION