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 standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textDe twee vormen zijn identiek. De afkorting ::type is compacter en
sluit mooi aan bij andere uitdrukkingen:
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
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 numeriWanneer een cast kan mislukken
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.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Oplossing: binnen ORDER BY gieten:
SELECT code FROM articles ORDER BY code::int;Probeer het
Toon voor elke bestelling ID en dag (alleen het datumgedeelte van order_at, van het type date). Twee kolommen. Bestel op ID.
Toon hint
De cast TIMESTAMP → DATE laat de tijd vallen: orderd_at::date.
Oplossing beschikbaar na 3 pogingen
Oefening beoordelen
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.
Toon hint
De || operator vereist operanden van hetzelfde type: id naar tekst casten is de schoonste manier.
Oplossing beschikbaar na 3 pogingen