Direct naar de hoofdinhoud
Module 6 · Les 4 van 424/57 in de cursus~10 min
Modulelessen (4/4)

CAST- en typeconversies

SQL is sterk getypeerd: elke kolom heeft een type (INTEGER, TEXT, NUMERIC, DATE, TIMESTAMP…), en voor veel bewerkingen zijn de typen om te matchen. Wanneer dat niet het geval is, of wanneer u een waarde wilt opmaken anders - je gebruikt een cast.

Twee gelijkwaardige syntaxis

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

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

De twee vormen zijn identiek. De afkorting ::type is compacter en sluit mooi aan bij andere uitdrukkingen:

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

Nuttige afgietsels van de dataset

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

Wanneer een cast kan mislukken

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)

Casts van string → nummer of string → datum zijn het meest riskant: ze geven een foutmelding als de string niet precies overeenkomt met de verwachte waarde formaat. In productie, op externe data, kun je het beste eerst valideren met TRIM / LOWER / regex.

Giet en BESTEL DOOR

Een geval dat subtiele bugs genereert: het sorteren van getallen opgeslagen als tekst.

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

Oplossing: binnen ORDER BY gieten:

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

Probeer het

Oefening#sql.m6.l4.e1
Pogingen: 0Laden…

Toon voor elke bestelling ID en dag (alleen het datumgedeelte van order_at, van het type date). Twee kolommen. Bestel op ID.

Editor laden…
Toon hint

De cast TIMESTAMP → DATE laat de tijd vallen: orderd_at::date.

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#sql.m6.l4.e2
Pogingen: 0Laden…

Geef voor elke klant een labelkolom weer waarin ID en e-mailadres worden samengevoegd, gescheiden door ' - ' (bijvoorbeeld '1 - alice.rossi@example.com'). Bestel op ID.

Editor laden…
Toon hint

De || operator vereist operanden van hetzelfde type: id naar tekst casten is de schoonste manier.

Oplossing beschikbaar na 3 pogingen