Module lessons (4/4)
CAST and type conversions
SQL is strongly typed: every column has a type (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP…), and many operations require the types
to match. When they don't — or when you want to format a value
differently — you use a cast.
Two equivalent syntaxes
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textThe two forms are identical. The shorthand ::type is more compact and
chains nicely with other expressions:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;Useful casts on the 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 numeriWhen a cast can fail
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)Casts from string → number or string → date are the riskiest:
they raise an error if the string does not exactly match the expected
format. In production, on external data, it is best to validate first
with TRIM / LOWER / regex.
Cast and ORDER BY
A case that generates subtle bugs: sorting numbers stored as text.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Solution: cast inside ORDER BY:
SELECT code FROM articles ORDER BY code::int;Try it
For each order, show id and day (only the date part of ordered_at, of type date). Two columns. Order by id.
Show hint
The TIMESTAMP → DATE cast drops the time: ordered_at::date.
Solution available after 3 attempts
Review exercise
For each customer show a label column that concatenates id and email separated by ' - ' (e.g. '1 - alice.rossi@example.com'). Order by id.
Show hint
The || operator requires operands of the same type: casting id to text is the cleanest way.
Solution available after 3 attempts