Salt la conținutul principal
Modulul 4 · Lecția 3 din 415/57 în curs~10 min
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

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

Se 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.

SQL
-- 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:

  1. În SELECT pentru a crea coloane derivate (exemplul de mai sus).
  2. În ORDER BY pentru sortarea „personalizată”: COD_PROTECTED_GARD_2
  3. În interiorul funcțiilor agregate pentru a „număra condiționat”:
    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;
    Acest model — 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:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

Este 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ă

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

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.

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

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

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).

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

Modelul SUM(CAZ WHEN ... THEN 1 ELSE 0 END) este numărul condiționat.

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