0Pricing
SQL Academy · Lezione

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ù rami
  • ELSE value — un'alternativa facoltativa
  • END — 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
END

CASE 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 ... END restituisce un valore per ogni riga
  • I rami vengono verificati dall'alto verso il basso; vale la prima corrispondenza
  • Se si omette ELSE, viene restituito NULL quando non c'è alcuna corrispondenza
  • Tutti i rami devono restituire tipi compatibili
  • CASE può essere usato in SELECT, WHERE e 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

  1. L'espressione CASE
  2. CASE semplice e con ricerca
  3. Raggruppare ed etichettare i dati
  4. CASE in ORDER BY e negli aggregati
← Torna a SQL Academy