型を変換する - CAST / 型変換
明示的な型変換 CAST(x AS type) と :: 記法(PostgreSQL)、暗黙変換の危険と安全な書き方
概念図
構文
sql
CAST(式 AS 型) / 式::型 (PostgreSQL)サンプル
数値の精度指定、タイムスタンプから日付抽出、文字列から DATE への変換
sql
SELECT
CAST(price AS DECIMAL(10, 2)) AS price_dec,
CAST(created_at AS DATE) AS created_date,
CAST('2026-04-14' AS DATE) AS event_date;CAST と :: 記法
標準 SQL の型変換は CAST(式 AS 型) です。PostgreSQL では省略記法の 式::型 も使えます(PostgreSQL 固有なので移植性を重視するなら CAST)。
型名は RDBMS で微妙に異なります: INT / INTEGER、DECIMAL(p, s) / NUMERIC(p, s)、TIMESTAMP / DATETIME など。
sql
-- 標準 SQL
SELECT CAST('42' AS INTEGER);
-- PostgreSQL 省略記法
SELECT '42'::INTEGER;TRY_CAST / SAFE_CAST
変換失敗時にエラーではなく NULL を返す安全版があります。
- SQL Server:
TRY_CAST(x AS type)/TRY_CONVERT - BigQuery:
SAFE_CAST(x AS type) - PostgreSQL: 標準では無いが
CASE式やregexpで事前検証 - MySQL: 失敗時に警告+NULL(挙動がゆるい)
落とし穴: 暗黙変換の危険
- 文字列と数値の比較:
WHERE id = '123'のように型がずれると、多くの RDBMS でインデックスが使えなくなり全件スキャンになる - MySQL の緩い変換:
WHERE name = 0が先頭が数字でない行まで一致してしまう事故が有名。必ず型を揃える - 文字列 → 日付: ロケールで "04/13/2026" の解釈が変わる。日付リテラルは ISO 形式 (
DATE '2026-04-13') で固定するのが安全
精度と丸めに注意
数値型のキャストは情報損失を伴うことがあります。CAST(3.7 AS INT) は多くの RDBMS で切り捨て(3)ですが、SQL Server は 0 に近い方への切り捨てなど微妙に挙動が違います。金額は DECIMAL(p, s)、整数演算は INTEGER、近似計算は REAL/DOUBLE と目的に応じて使い分け、お金は浮動小数にしないのが鉄則です。
