Lecții din modul (3/4)
Logica condițională: CASE WHEN
Tot ceea ce am văzut până acum extrage datele așa cum sunt. De multe ori, totuși, vrei
a-l transforma: clasifică salariile pe niveluri, marchează noile angajări ca
„junior”, traduce un cod numeric într-o etichetă care poate fi citită. Standardul SQL
instrumentul pentru aceasta se numește CASE WHEN.
Sintaxa: un mini if/else
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
...
ELSE default_value
ENDSe citește exact ca un if/else if/else în orice limbă: SQL evaluează
conditiile in ordine si se opreste la primul adevarat, returnand
value corespunzătoare. Dacă niciuna nu este adevărată, returnează valoarea ELSE. Dacă tu
omiteți ELSE și nicio ramură nu se potrivește, returnează NULL.
-- Classify employees by salary tier:
SELECT first_name,
last_name,
salary,
CASE
WHEN salary >= 50000 THEN 'Senior'
WHEN salary >= 35000 THEN 'Mid'
ELSE 'Junior'
END AS tier
FROM employees;CASE locuiește în interiorul SELECT: produce o coloană la fel ca oricare
funcția și este perfect normal să îi dai un alias cu AS (aici
tier).
Unde să folosiți CASE
Trei locuri recurente:
- În
SELECTpentru a crea coloane derivate (exemplul de mai sus). - În
ORDER BYpentru sortarea „personalizată”: COD_PROTECTED_GARD_2 - În interiorul funcțiilor agregate pentru a „număra condiționat”:
Acest model —SQL
SELECT COUNT(*) AS total, SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior, SUM(CASE WHEN salary < 35000 THEN 1 ELSE 0 END) AS junior FROM employees;SUM(CASE WHEN … THEN 1 ELSE 0 END)— este cel mai frecvent „număr condiționat” folosit în tablouri de bord.
Forma „compactă”.
Există și o variantă mai scurtă când compari o singură expresie față de valori exacte:
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDEste echivalent cu CASE WHEN Department_id = 1 THEN ... WHEN Department_id = 2 THEN ... END, doar mai compact. Funcționează doar pentru egalitatea exactă: dacă
ai nevoie de >= sau de altă comparație, trebuie să te întorci la extins
formă.
Încearcă
Pentru fiecare angajat, afișați prenumele (prenume), numele de familie (numele) și o coloană „nivel” care este „Alto” dacă salariul este de cel puțin 50000, în caz contrar, „Standard”. Trei coloane, un rând per angajat.
Afișează indiciu
Condiția este salariul >= 50000. Nu uitați să închideți CAZUL cu END și să utilizați alias-ul „tier”.
Soluție disponibilă după 3 încercări
Exercițiu de revizuire
Pentru fiecare departament (department_id), numărați câți angajați au un salariu mare (>= 50000) și câți unul standard (< 50000) folosind SUM(CASE...). Trei coloane: Department_id, high, standard. Comandă după departament_id (NULLS LAST).
Afișează indiciu
Modelul SUM(CAZ WHEN ... THEN 1 ELSE 0 END) este numărul condiționat.
Soluție disponibilă după 3 încercări