Vai al contenuto
eLearner.app
Modulo 6 · Lezione 4 di 424/57 nel corso~10 min
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
-- SQL standard:
CAST(123 AS TEXT)

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

Le due forme sono identiche. La shorthand ::tipo è più compatta e si incatena bene con altre espressioni:

SQL
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

SQL
TIMESTAMPDATE          ordered_at::date
NUMERICINTEGER       price::int           -- tronca!
INTEGERNUMERIC       quantity::numeric    -- per evitare div. intera
INTEGERTEXT          id::text             -- per concatenare con ||
TEXTDATE          '2024-03-05'::date
NUMERICTEXT          price::text          -- per LIKE su numeri

Quando il cast può fallire

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)

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.

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

Soluzione: castare in ORDER BY:

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

Prova tu

Esercizio#sql.m6.l4.e1
Tentativi: 0Caricamento…

Per ogni ordine, mostra id e day (solo la parte data di ordered_at, di tipo date). Due colonne. Ordina per id.

Caricamento editor…
Mostra suggerimento

Il cast TIMESTAMP → DATE elimina l'ora: ordered_at::date.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#sql.m6.l4.e2
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

L'operatore || richiede operandi dello stesso tipo: castare id a text è la via più pulita.

Soluzione disponibile dopo 3 tentativi