メインコンテンツにスキップ
モジュール 6 · レッスン 4 / 4コース内の 24/57~10 min
モジュールのレッスン (4/4)

CAST と型変換

SQL は厳密に型指定されています。すべての列には型があります (INTEGER、TEXT、 NUMERIC、DATE、TIMESTAMP…)、および多くの操作では次のタイプが必要です 一致します。そうでない場合、または値をフォーマットしたい場合 違うのは、キャストを使用することです。

2 つの同等の構文

SQL
-- SQL standard:
CAST(123 AS TEXT)

-- PostgreSQL shorthand (più comune nella pratica):
123::text

2 つの形式は同一です。短縮表現 ::type はよりコンパクトで、 他の式とうまく連鎖します。

SQL
SELECT ordered_at::date AS day,
       (oi.quantity * oi.unit_price)::numeric(10,2) AS total,
       id::text || ' - ' || email AS label
FROM   …;

データセットの便利なキャスト

SQL
TIMESTAMP → DATE          ordered_at::date
NUMERIC   → INTEGER       price::int           -- tronca!
INTEGER   → NUMERIC       quantity::numeric    -- per evitare div. intera
INTEGER   → TEXT          id::text             -- per concatenare con ||
TEXT      → DATE          '2024-03-05'::date
NUMERIC   → TEXT          price::text          -- per LIKE su numeri

キャストが失敗する可能性がある場合

SQL
SELECT 'abc'::int;   -- ERRORE: invalid input syntax for type integer
SELECT '12.5'::int;  -- ERRORE: invalid input syntax for type integer
SELECT 12.5::int;    -- 12   (cast numerico-numerico: arrotonda)

文字列 → 数値 または 文字列 → 日付 からのキャストが最も危険です。 文字列が期待されたものと正確に一致しない場合、エラーが発生します。 形式。運用環境では、外部データで最初に検証することが最善です TRIM / LOWER / 正規表現を使用します。

キャストして注文する

微妙なバグが発生するケース: テキストとして保存された数値の並べ替え。

SQL
SELECT '2', '10', '1' ORDER BY 1;  -- '1', '10', '2'   (alfabetico!)

解決策: ORDER BY 内にキャストします。

SQL
SELECT code FROM articles ORDER BY code::int;

試してみてください

運動#sql.m6.l4.e1
試行回数: 0読み込み中…

注文ごとに、ID と日を表示します (日付タイプの、ordered_at の日付部分のみ)。 2 つの列。 IDで注文します。

エディターを読み込み中…
ヒントを表示

TIMESTAMP → DATE キャストは、ordered_at::date の時刻を削除します。

3 回の試行後に解決策が利用可能になります

復習演習

運動#sql.m6.l4.e2
試行回数: 0読み込み中…

顧客ごとに、ID と電子メールを ' - ' で区切って連結したラベル列を表示します (例: '1 - alice.rossi@example.com')。 IDで注文します。

エディターを読み込み中…
ヒントを表示

||演算子には同じ型のオペランドが必要です。ID をテキストにキャストするのが最もクリーンな方法です。

3 回の試行後に解決策が利用可能になります