Lecții din modul (4/4)
CAST și conversii de tip
SQL este puternic tipat: fiecare coloană are un tip (INTEGER, TEXT,
NUMERIC, DATE, TIMESTAMP…), și multe operațiuni necesită tipurile
a se potrivi. Când nu o fac - sau când doriți să formatați o valoare
diferit — folosești un cast.
Două sintaxe echivalente
-- SQL standard:
CAST(123 AS TEXT)
-- PostgreSQL shorthand (più comune nella pratica):
123::textCele două forme sunt identice. Stenografia ::type este mai compactă și
înlănțuiește frumos cu alte expresii:
SELECT ordered_at::date AS day,
(oi.quantity * oi.unit_price)::numeric(10,2) AS total,
id::text || ' - ' || email AS label
FROM …;Transformări utile pe setul de date
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 numeriCând o distribuție poate eșua
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)Distribuțiile de la șir → număr sau șir → dată sunt cele mai riscante:
generează o eroare dacă șirul nu se potrivește exact cu cel așteptat
format. În producție, pe date externe, cel mai bine este să validezi mai întâi
cu TRIM / LOWER / regex.
Distribuie și COMANDA PENTRU
Un caz care generează erori subtile: sortarea numerelor stocate ca text.
SELECT '2', '10', '1' ORDER BY 1; -- '1', '10', '2' (alfabetico!)Soluție: aruncați în interiorul ORDER BY:
SELECT code FROM articles ORDER BY code::int;Încearcă
Pentru fiecare comandă, afișați id-ul și ziua (numai partea dată din ordered_at, de tip data). Două coloane. Comandă după id.
Afișează indiciu
Distribuția TIMESTAMP → DATE elimină ora: ordered_at::date.
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Pentru fiecare client, afișați o coloană de etichetă care concatenează id-ul și adresa de e-mail separate prin „- ” (de exemplu, „1 - alice.rossi@example.com”). Comandă după id.
Afișează indiciu
Cel || operatorul necesită operanzi de același tip: turnarea id-ului în text este cea mai curată modalitate.
Soluție disponibilă după 3 încercări