Lezioni del modulo (4/4)
CAST e conversioni di tipo
SQL è fortemente tipizzato: ogni colonna ha un tipo (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP…), e molte operazioni richiedono che i tipi
coincidano. Quando non coincidono — o quando vuoi formattare un valore
in modo diverso — si usa un cast.
Due sintassi equivalenti
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textLe due forme sono identiche. La shorthand ::tipo è più compatta e si
incatena bene con altre espressioni:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;Cast utili nel dataset
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 numeriQuando il cast può fallire
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)I cast stringa → numero o stringa → data sono i più rischiosi:
sollevano errore se la stringa non rispetta esattamente il formato atteso.
In produzione, su dati esterni, conviene validare prima con TRIM /
LOWER / regex.
Cast e ORDER BY
Un caso che genera bug subdoli: ordinare numeri salvati come testo.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Soluzione: castare in ORDER BY:
SELECT code FROM articles ORDER BY code::int;Prova tu
Per ogni ordine, mostra id e day (solo la parte data di ordered_at, di tipo date). Due colonne. Ordina per id.
Mostra suggerimento
Il cast TIMESTAMP → DATE elimina l'ora: ordered_at::date.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Per ogni cliente mostra una colonna label che concatena l'id e l'email separati da ' - ' (es. '1 - alice.rossi@example.com'). Ordina per id.
Mostra suggerimento
L'operatore || richiede operandi dello stesso tipo: castare id a text è la via più pulita.
Soluzione disponibile dopo 3 tentativi