Query Go
型を変換する - CAST / 型変換 の使い方・オプション・サンプル

型を変換する - CAST / 型変換

明示的な型変換 CAST(x AS type) と :: 記法(PostgreSQL)、暗黙変換の危険と安全な書き方

概念図

CAST / 型変換 diagram

構文

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 / INTEGERDECIMAL(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 と目的に応じて使い分け、お金は浮動小数にしないのが鉄則です。

関連トピック