Vai al contenuto
eLearner.app
Modulo 4 · Lezione 3 di 415/57 nel corso~10 min
Lezioni del modulo (3/4)

Logica condizionale: CASE WHEN

Tutto quello che abbiamo visto finora estrae i dati così come sono. Spesso però vuoi trasformarli: classificare gli stipendi in fasce, marcare i nuovi assunti come "junior", tradurre un codice numerico in un'etichetta leggibile. Lo strumento standard di SQL per questo si chiama CASE WHEN.

La sintassi: un mini if/else

SQL
CASE
  WHEN condizione_1 THEN valore_1
  WHEN condizione_2 THEN valore_2
  ...
  ELSE valore_di_default
END

Si legge esattamente come un if/else if/else di qualsiasi linguaggio: SQL valuta le condizioni in ordine e si ferma alla prima vera, restituendo il relativo valore. Se nessuna è vera, restituisce il valore dell'ELSE. Se ometti l'ELSE e nessun ramo è vero, restituisce NULL.

SQL
-- Classifica i dipendenti per fascia di stipendio:
SELECT first_name,
       last_name,
       salary,
       CASE
         WHEN salary >= 50000 THEN 'Senior'
         WHEN salary >= 35000 THEN 'Mid'
         ELSE                       'Junior'
       END AS tier
FROM   employees;

Il CASE vive dentro la SELECT: produce una colonna come una qualsiasi funzione, ed è normalissimo dargli un alias con AS (qui tier).

Dove si usa CASE

Tre posti ricorrenti:

  1. Nella SELECT per creare colonne derivate (l'esempio sopra).
  2. Nell'ORDER BY per ordini "custom":
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Prima Ingegneria, poi gli altri, alfabeticamente nel cognome.
  3. Dentro funzioni di aggregazione per "contare condizionalmente":
    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;
    Questo pattern — SUM(CASE WHEN … THEN 1 ELSE 0 END) — è il "conteggio condizionale" più usato nelle dashboard.

La forma "compatta"

Esiste anche una variante più corta quando confronti una sola espressione con valori esatti:

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

È equivalente a CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END, solo più compatta. Funziona solo per uguaglianza esatta: se serve >= o un altro confronto, devi tornare alla forma estesa.

Prova tu

Esercizio#sql.m4.l3.e1
Tentativi: 0Caricamento…

Per ogni dipendente mostra nome (first_name), cognome (last_name) e una colonna 'tier' che vale 'Alto' se lo stipendio è almeno 50000, altrimenti 'Standard'. Tre colonne, una riga per dipendente.

Caricamento editor…
Mostra suggerimento

La condizione è salary >= 50000. Ricorda di chiudere il CASE con END e di dare l'alias 'tier'.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#sql.m4.l3.e2
Tentativi: 0Caricamento…

Per ogni dipartimento (department_id), conta quanti dipendenti hanno stipendio alto (>= 50000) e quanti standard (< 50000) usando SUM(CASE...). Tre colonne: department_id, high, standard. Ordina per department_id (NULLS LAST).

Caricamento editor…
Mostra suggerimento

Il pattern SUM(CASE WHEN ... THEN 1 ELSE 0 END) è il conteggio condizionale.

Soluzione disponibile dopo 3 tentativi