モジュール 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::text2 つの形式は同一です。短縮表現 ::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 回の試行後に解決策が利用可能になります