コマンド道場

$ man cast

CAST

型変換

値を別の型に変換する。CAST は標準 SQL、:: は PostgreSQL の短い書き方。

呼び出しの形

CAST(値 AS 型)
値::型

つまずきやすいところ

  • ::PostgreSQL 固有です。標準 SQL は CAST(値 AS 型) で、移植するならこちらを使ってください。

  • 整数どうしの割り算は切り捨てられます。小数がほしいなら、割る前に型を変えてください。

  • 変換に失敗すると実行時エラーです。1 行でも変換できない値があれば、問い合わせ全体が落ちます。

  • 「失敗したら NULL」という型変換は PostgreSQL 18 にはありません。pg_input_is_valid先に調べるか、条件で絞り込んでください。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

整数の割り算は切り捨てられる
SELECT 7 / 2 AS seisu_warizan, CAST(7 AS numeric) / 2 AS shousu, 7::numeric / 2 AS pg_no_kakikata
seisu_warizanshousupg_no_kakikata
33.50000000000000003.5000000000000000

1

型を変えないと 3 になります。:: は PostgreSQL 固有の書き方です。

数値や日付を文字列にしてつなぐ
SELECT name, hired_on, CAST(hired_on AS text) AS moji, name || ' (' || CAST(salary AS text) || ')' AS renketsu FROM shain ORDER BY shain_id
namehired_onmojirenketsu
鈴木2014-04-012014-04-01鈴木 (980000)
佐藤2016-10-012016-10-01佐藤 (720000)
田中2019-04-012019-04-01田中 (520000)
中村2020-04-012020-04-01中村 (530000)
小林2024-04-012024-04-01小林 (445050)
加藤2018-04-012018-04-01加藤 (610000)
吉田2022-10-012022-10-01吉田 (468000)
山田2015-04-012015-04-01山田 (700000)

18(うち 8 行を表示)

変換できるかどうかを先に調べる
SELECT pg_input_is_valid('123', 'integer') AS kekka_ok, pg_input_is_valid('abc', 'integer') AS kekka_ng
kekka_okkekka_ng
truefalse

1

PostgreSQL 固有の関数です。落ちてから気づくのではなく、事前に判定できます。

説明

CAST(値 AS 型)標準 SQL の型変換です。PostgreSQL には 値::型 という短い書き方もありますが、こちらは PostgreSQL 固有なので、他の製品でも動かしたいなら CAST を使ってください。

よく使う場面は 3 つあります。

  • 整数どうしの割り算を小数にしたいとき(整数のままだと切り捨てられます)
  • double precisionnumeric にして、2 引数の ROUND を使いたいとき
  • 数値や日付を文字列にして、連結したいとき

⚠️ 変換できない値を渡すと実行時エラーになります。文字列を数値にするような変換は、データが 1 行でも汚れていれば問い合わせ全体が落ちます

PostgreSQL 18 には「失敗したら NULL を返す」型変換はありません(CAST(... DEFAULT ... ON ERROR) は構文エラーになります)。代わりに pg_input_is_valid(値, 型名)変換できるかどうかを先に調べられます。⚠️ これは PostgreSQL 固有なので、移植を考えるなら WHERE 列 ~ '^[0-9]+$' のような条件であらかじめ絞り込むほうが安全です。

次に読む

関係する関数

根拠にした一次情報