Se già conosci CASE, sai che è un modo per inserire logica direttamente nella query. Ma non tutti sanno che CASE ha due forme. Se CASE WHEN ... è come un controllo if-else, allora il CASE semplice è come lo switch-case di altri linguaggi: confronta una sola espressione con diversi valori ed esegue il blocco corrispondente.
È più compatto e intuitivo quando devi confrontare un campo con valori fissi.
Sintassi del CASE semplice
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
Facilissimo:
expression— è l'espressione o il campo che viene confrontato convalue1,value2ecc.THENindica cosa restituire se c'è corrispondenza.ELSE— cosa restituire se non c'è nessuna corrispondenza (puoi ometterlo, ma meglio di no).
Esempio: Voti degli studenti
Immagina una tabella students con una colonna grade che contiene un intero da 2 a 5. Vogliamo mostrare l'interpretazione testuale dei voti.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Eccellente'
WHEN 4 THEN 'Buono'
WHEN 3 THEN 'Sufficiente'
WHEN 2 THEN 'Insufficiente'
ELSE 'Sconosciuto'
END AS valutazione_testo
FROM students;
Qui CASE confronta il valore del campo grade con i valori fissi 2, 3, 4, 5.
Esempio: Categorie dei prodotti per codice
Nella tabella products c'è il campo category_code con etichette corte: 'el', 'frn', 'bks' ecc. Vogliamo mostrare il nome leggibile della categoria.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Elettronica'
WHEN 'frn' THEN 'Mobili'
WHEN 'bks' THEN 'Libri'
ELSE 'Altro'
END AS nome_categoria
FROM products;
Questa tecnica è super comoda quando vuoi mostrare un testo "umano" invece del codice.
Esempio: Nomi dei mesi
A volte vuoi mostrare i nomi dei mesi in testo a partire dal numero:
SELECT
EXTRACT(MONTH FROM order_date) AS numero_mese,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Gennaio'
WHEN 2 THEN 'Febbraio'
WHEN 3 THEN 'Marzo'
WHEN 4 THEN 'Aprile'
WHEN 5 THEN 'Maggio'
WHEN 6 THEN 'Giugno'
WHEN 7 THEN 'Luglio'
WHEN 8 THEN 'Agosto'
WHEN 9 THEN 'Settembre'
WHEN 10 THEN 'Ottobre'
WHEN 11 THEN 'Novembre'
WHEN 12 THEN 'Dicembre'
ELSE 'Sconosciuto'
END AS nome_mese
FROM orders;
Qui il CASE semplice rende chiaro ciò che altrimenti sarebbero solo numeri da 1 a 12.
Lavorare con NULL nel CASE semplice
È importante capire che se il valore viene confrontato con NULL, il risultato sarà NULL, perché NULL = NULL — non è vero, ma sconosciuto.
Esempio con NULL:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Attivo'
WHEN 'blocked' THEN 'Bloccato'
WHEN NULL THEN 'Nessuno stato' -- non funziona!
ELSE 'Sconosciuto'
END AS stato_utente
FROM users;
Invece di WHEN NULL dovresti usare ELSE, oppure semplicemente usare il CASE di ricerca (che abbiamo visto nella lezione precedente):
CASE
WHEN status IS NULL THEN 'Nessuno stato'
...
Confronto con il CASE di ricerca
| Caratteristica | CASE semplice | CASE di ricerca |
|---|---|---|
| Confronto con valori specifici | ✅ Comodo | ❌ Non adatto |
| Flessibilità delle condizioni (>, IS NULL) | ❌ Non si può | ✅ Si può |
| Analogo nella programmazione | switch-case |
if-else |
Casi pratici
Esempio: Visualizzazione dello stato di una richiesta
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Nuova'
WHEN 'in_progress' THEN '🔵 In lavorazione'
WHEN 'done' THEN '🟢 Completata'
ELSE '⚪ Sconosciuto'
END AS etichetta_stato
FROM requests;
| request_id | etichetta_stato |
|---|---|
| 101 | 🟡 Nuova |
| 102 | 🔵 In lavorazione |
| 103 | 🟢 Completata |
| 104 | ⚪ Sconosciuto |
| 105 | ⚪ Sconosciuto |
Qui CASE funziona come un traduttore: trasforma stati tecnici in etichette comprensibili (e anche carine). E se lo stato è sconosciuto o NULL — l'utente vedrà ⚪ «Sconosciuto».
Esempio: Raggruppamento per categoria per un report
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Risorse Umane'
WHEN 'IT' THEN 'Tecnologia'
WHEN 'FIN' THEN 'Finanza'
ELSE 'Altro'
END AS nome_reparto,
COUNT(*) AS numero_personale
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Risorse Umane'
WHEN 'IT' THEN 'Tecnologia'
WHEN 'FIN' THEN 'Finanza'
ELSE 'Altro'
END;
Risultato:
| nome_reparto | numero_personale |
|---|---|
| Risorse Umane | 3 |
| Tecnologia | 3 |
| Finanza | 2 |
| Altro | 2 |
Cosa succede qui:
- I dipendenti del reparto HR finiscono nella categoria Risorse Umane.
- IT — diventa Tecnologia.
- FIN — diventa Finanza.
- Tutto il resto, inclusi SALES e NULL, va in Altro. Questo approccio è perfetto per creare report amichevoli e chiari.
Errori comuni
- Hai dimenticato
ELSE→ ottieniNULLse nessun valore corrisponde. - Confronti con
NULL→ non funziona, usaIS NULLe ilCASEdi ricerca. - Confronti tipi incompatibili → per esempio,
CASE grade WHEN '5'segradeè numerico.
Il CASE semplice è il tuo strumento quando vuoi confrontare un valore con una serie di possibili. È compatto, leggibile e super utile per classificazione testuale, visualizzazione, conversione di codici e raggruppamento pratico.
Se invece devi controllare intervalli, NULL o condizioni più complesse — usa il CASE di ricerca. SQL ama la chiarezza. E CASE è il tuo strumento per darle forma.
GO TO FULL VERSION