Salt la conținutul principal
Modulul 6 · Lecția 4 din 424/57 în curs~10 min
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
-- SQL standard:
CAST(123 AS TEXT)

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

Cele două forme sunt identice. Stenografia ::type este mai compactă și înlănțuiește frumos cu alte expresii:

SQL
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

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

Când o distribuție poate eșua

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)

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.

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

Soluție: aruncați în interiorul ORDER BY:

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

Încearcă

Exercițiu#sql.m6.l4.e1
Încercări: 0Se încarcă…

Pentru fiecare comandă, afișați id-ul și ziua (numai partea dată din ordered_at, de tip data). Două coloane. Comandă după id.

Se încarcă editorul...
Afișează indiciu

Distribuția TIMESTAMP → DATE elimină ora: ordered_at::date.

Soluție disponibilă după 3 încercări

Exercițiu de revizuire

Exercițiu#sql.m6.l4.e2
Încercări: 0Se încarcă…

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.

Se încarcă editorul...
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