L'espressione CASE
Logica IF/THEN all'interno di una query
L'espressione CASE è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Logica condizionale in SQL
A volte è necessario che una query prenda una decisione: se accade questo, allora quello, altrimenti qualcos'altro. SQL mette a disposizione l'espressione CASE proprio per questo.
CASE consente di restituire valori diversi in base alle condizioni, direttamente all'interno di un SELECT. È la versione SQL di una catena if/else.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Anatomia di CASE
Un'espressione CASE è composta da alcuni elementi:
WHEN condition THEN value— uno o più ramiELSE value— un'alternativa facoltativaEND— chiude l'espressione (obbligatorio!)
SQL valuta i rami WHEN dall'alto verso il basso e restituisce il valore del primo ramo vero.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE restituisce un valore
L'idea fondamentale è che un'espressione CASE restituisce un singolo valore per riga. Poiché produce un valore, è possibile usarla ovunque sia consentito un valore — nell'elenco SELECT, in WHERE, in ORDER BY e persino all'interno delle funzioni.
Qui assegna a ogni ordine un semplice stato.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;La prima corrispondenza ha la precedenza
L'ordine è importante. SQL controlla ogni WHEN in sequenza e si ferma al primo ramo vero. I rami successivi vengono ignorati anche se corrisponderebbero a loro volta.
Di seguito, un ordine superiore a 1000 è 'large', non 'medium', perché vince il primo ramo corrispondente.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;Il ramo ELSE
Il ramo ELSE gestisce tutti gli altri casi. Se nessuna condizione WHEN è vera, CASE restituisce il valore di ELSE.
Se si omette ELSE e non c'è alcuna corrispondenza, CASE restituisce NULL. Questa è una fonte comune di NULL inattesi, quindi aggiunga un ELSE esplicito quando desidera un'alternativa definita.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)Le condizioni possono essere qualsiasi cosa
Una condizione WHEN è semplicemente un'espressione booleana — dello stesso tipo di quelle che si scrivono in una clausola WHERE. È possibile usare confronti, AND, OR, BETWEEN, IN, LIKE e altro ancora.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;I tipi restituiti devono essere compatibili
Ogni ramo di un CASE deve restituire valori di un tipo compatibile, perché la colonna deve avere un unico tipo. Combinare testo e numeri causerà un errore o una conversione di tipo inattesa.
Se un ramo deve contenere numeri e un altro testo, esegua un cast esplicito in modo da allineare i tipi.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;Usare CASE in WHERE
Poiché CASE produce un valore, è possibile confrontarne il risultato all'interno di una clausola WHERE. Questo è utile per le regole di filtraggio dinamiche.
Spesso, però, la semplice logica booleana in WHERE è più chiara — ricorra a CASE in WHERE solo quando la logica condizionale semplifica realmente la condizione.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;Nidificare CASE
È possibile inserire un CASE all'interno di un altro ramo CASE per esprimere una logica a più livelli. Funziona, ma le espressioni profondamente nidificate diventano difficili da leggere.
Mantenga la nidificazione a un livello ridotto; se cresce, una colonna separata o una tabella di ricerca è di solito più chiara.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE con funzioni di aggregazione
Un modello potente consiste nell'inserire un CASE in una funzione di aggregazione come SUM o COUNT. In questo modo si contano o sommano condizionalmente le righe in un'unica passata — talvolta chiamata aggregazione condizionale o pivot.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE che restituisce NULL intenzionalmente
Restituire NULL da un ramo è talvolta esattamente ciò che serve — ad esempio per oscurare un valore che non si desidera visualizzare o per passarlo a una funzione di aggregazione successiva che ignora i NULL.
Qui solo gli ordini grandi conservano il totale; gli altri diventano NULL, così AVG li ignorerebbe.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Verifica rapida
Consideri questa espressione per una riga in cui total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Quale valore restituisce?
Riepilogo: l'espressione CASE
Ha appreso i fondamenti della logica condizionale in SQL:
CASE WHEN ... THEN ... ELSE ... ENDrestituisce un valore per ogni riga- I rami vengono verificati dall'alto verso il basso; vale la prima corrispondenza
- Se si omette
ELSE, viene restituitoNULLquando non c'è alcuna corrispondenza - Tutti i rami devono restituire tipi compatibili
CASEpuò essere usato inSELECT,WHEREe all'interno delle funzioni di aggregazione
Successivamente confronteremo le due forme sintattiche di CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Domande Frequenti
La lezione «L'espressione CASE» è gratuita?
Sì — il testo completo di «L'espressione CASE» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «L'espressione CASE»?
Logica IF/THEN all'interno di una query Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «L'espressione CASE»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- L'espressione CASE
- CASE semplice e con ricerca
- Raggruppare ed etichettare i dati
- CASE in ORDER BY e negli aggregati