CodeGym /Corsi /SQL SELF /Espressioni condizionali: CASE <espressione>...

Espressioni condizionali: CASE <espressione> WHEN ... THEN ... ELSE ... END

SQL SELF
Livello 10 , Lezione 1
Disponibile

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 con value1, value2 ecc.
  • THEN indica 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 → ottieni NULL se nessun valore corrisponde.
  • Confronti con NULL → non funziona, usa IS NULL e il CASE di ricerca.
  • Confronti tipi incompatibili → per esempio, CASE grade WHEN '5' se grade è 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.

2
Compito
SQL SELF, livello 10, lezione 1
Bloccato
Assegnazione di descrizioni testuali ai voti
Assegnazione di descrizioni testuali ai voti
2
Compito
SQL SELF, livello 10, lezione 1
Bloccato
Confronto delle categorie di prodotti
Confronto delle categorie di prodotti
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION