Istruzione CASE e caso nidificato in SQL Server: esempio T-SQL
โก Riepilogo intelligente
CASE รจ un'espressione condizionale in SQL Server che restituisce un valore in base alla prima condizione che risulta vera, offrendo forme semplici e con ricerca, oltre alla possibilitร di annidarsi all'interno di IFโฆELSE, UPDATE e ORDER BY.

Panoramica del caso nella vita reale!
Anche nella vita reale, compiamo azioni diverse a seconda dell'esito di diverse circostanze. Per approfondire l'argomento, si consideri l'esempio seguente:
- Se i biglietti aerei costano meno di $ 100, visiterรฒ Los Angeles.
- Se i biglietti aerei costano tra i 100 e i 200 dollari, allora andrรฒ a New York.
- Se i biglietti aerei costano tra i 200 e i 400 dollari, allora andrรฒ in Europa.
- Altrimenti, preferirรฒ visitare un luogo turistico nelle vicinanze.
Consideriamo ora di categorizzare separatamente la condizione e l'azione nell'esempio precedente:
| Condizioni โ Biglietti aerei | Azioni eseguite solo se la condizione รจ VERA |
| Less di $ 100 | Visitare Los Angeles |
| Tra $ 100 a $ 200 | Visita New York |
| Tra $ 200 a $ 400 | Visita l'Europa |
| Nessuna delle condizioni di cui sopra รจ stata soddisfatta | Localitร turistica nelle vicinanze |
Nell'esempio precedente, possiamo vedere che l'esito delle diverse condizioni governa un'azione separata. Ad esempio, il visitatore eseguirร l'atto di visitare New York solo nella condizione che il biglietto aereo sia compreso tra $100 e $200. Allo stesso modo, il MS SQL L'istruzione CASE offre anche la possibilitร di eseguire diverse istruzioni T-SQL in base al risultato di diverse condizioni.
Che cos'รจ l'istruzione CASE in SQL Server?
Dichiarazione del CASO in SQL Server รจ l'estensione del SE ALTRO A differenza di IFโฆELSE, dove รจ consentita al massimo una sola condizione, CASE permette all'utente di applicare piรน condizioni per eseguire diverse serie di azioni in MS SQL. Restituisce un valore corrispondente associato alla condizione definita dall'utente.
Impariamo come usare CASE in SQL e il suo concetto nelle sezioni seguenti. In MS SQL esistono due tipi di CASE:
- CASO semplice
- CASO cercato
CASO semplice
Sintassi per il caso semplice
CASE <Case_Expression> WHEN Value_1 THEN Statement_1 WHEN Value_2 THEN Statement_2 . . WHEN Value_N THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
Qui:
- Il parametro Case_Expression indica l'espressione che verrร successivamente confrontata con Value_1, Value_2 e cosรฌ via.
- I parametri Statement_1, Statement_2โฆ indicano le istruzioni che verranno eseguite se Case_Expression = Value_1, Case_Expression = Value_2 e cosรฌ via.
- In sintesi, la condizione รจ se Case_Expression = Value_N, e l'azione consiste nell'esecuzione di Statement_N se il risultato di cui sopra รจ TRUE.
- ALIAS_NAME รจ facoltativo e rappresenta il nome alias assegnato al risultato dell'istruzione CASE di SQL Server. Viene utilizzato principalmente quando si usa CASE nella clausola SELECT di SQL Server.
Regole per il caso semplice
- Simple Case consente solo un controllo di uguaglianza tra Case_Expression con Value_1 e Value_N.
- L'espressione Case_Expression viene confrontata con un valore, in ordine, a partire dal primo valore, ovvero Value_1. Di seguito รจ riportato il metodo di esecuzione:
- Se Case_Expression รจ equivalente a Value_1, le ulteriori istruzioni WHENโฆTHEN verranno saltate e l'esecuzione CASE terminerร immediatamente.
- Se Case_Expression non corrisponde a Value_1, allora Case_Expression viene confrontata con Value_2 per verificarne l'equivalenza. Questo processo di confronto tra Case_Expression e un valore continua finchรฉ Case_Expression non trova un valore equivalente corrispondente nell'insieme di Value_1, Value_2 e cosรฌ via.
- Se non viene trovata alcuna corrispondenza, il controllo passa all'istruzione ELSE e viene eseguita l'istruzione Statement_Else.
- ALTRO รจ facoltativo.
- Se ELSE non รจ presente e Case_Expression non corrisponde a nessuno dei valori, viene visualizzato NULL.
Il diagramma seguente illustra il flusso di esecuzione di un caso semplice:
Esempi
Supponiamo di avere una tabella chiamata 'Guru99' con due colonne, Tutorial_ID e Tutorial_name, e quattro righe, come mostrato di seguito. Useremo questo 'GuruTabella 99 negli esempi che seguono.
Domanda 1: CASO SEMPLICE con l'opzione NO ELSE
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Risultato: Il diagramma seguente illustra il flusso di esecuzione di un CASO SEMPLICE senza ELSE.
Query 2: CASO SEMPLICE con l'opzione ELSE
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Risultato: Il diagramma seguente illustra il flusso di esecuzione di un CASE SEMPLICE con ELSE.
CASO cercato
Sintassi per il caso cercato
CASE WHEN <Boolean_Expression_1> THEN Statement_1 WHEN <Boolean_Expression_2> THEN Statement_2 . . WHEN <Boolean_Expression_N> THEN Statement_N [ELSE Statement_Else] END AS [ALIAS_NAME]
Qui:
- Il parametro Boolean_Expression_1โฆ indica l'espressione che verrร valutata come VERA o FALSA.
- I parametri Statement_1, Statement_2โฆ indicano le istruzioni che verranno eseguite se il risultato corrispondente di Boolean_Expression_1, Boolean_Expression_2 รจ TRUE.
- In sintesi, la condizione รจ Boolean_Expression_1โฆ e lโazione รจ lโesecuzione dellโistruzione_N se la suddetta Boolean_Expression_1 รจ VERA.
- ALIAS_NAME รจ facoltativo ed รจ il nome alias assegnato al risultato dell'istruzione CASE. Viene utilizzato principalmente quando si usa CASE nella clausola SELECT.
Regole per il caso cercato
- A differenza del caso semplice, il caso ricercato non si limita al solo controllo di uguaglianza, ma consente anche un'espressione booleana.
- L'espressione booleana viene valutata in ordine, a partire dalla prima espressione booleana, ovvero Boolean_Expression_1. Di seguito รจ riportato il procedimento di esecuzione:
- Se Boolean_Expression_1 รจ TRUE, le successive istruzioni WHENโฆTHEN vengono saltate e l'esecuzione di CASE termina immediatamente.
- Se Boolean_Expression_1 รจ FALSE, allora Boolean_Expression_2 viene valutata per verificare se รจ TRUE. Questo processo di valutazione dell'espressione booleana continua finchรฉ una delle espressioni booleane non restituisce TRUE.
- Se non viene trovata alcuna corrispondenza, il controllo passa all'istruzione ELSE e viene eseguita l'istruzione Statement_Else.
- Come nel caso semplice, anche nel caso di ricerca l'istruzione ELSE รจ facoltativa.
- Se ELSE non รจ presente e nessuna delle espressioni booleane restituisce TRUE, viene visualizzato NULL.
Il diagramma seguente illustra il flusso di esecuzione del caso ricercato:
Esempi
Query 1: CASO RICERCATO con l'opzione NO ELSE
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Risultato: Il diagramma seguente illustra il flusso di esecuzione del CASO RICERCATO senza NO ELSE.
Query 2: CASO RICERCATO con l'opzione ELSE
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Risultato: Il diagramma seguente illustra il flusso di esecuzione del CASO RICERCATO con ELSE.
Differenza tra approccio di esecuzione: CASO SEMPLICE e CASO DI RICERCA
Esaminiamo l'esempio SEMPLICE riportato di seguito:
SELECT Tutorial_ID, Tutorial_name, CASE Tutorial_name WHEN 'SQL' THEN 'SQL is developed by IBM' WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' ELSE 'This is NO SQL language.' END AS Description FROM Guru99
Qui, 'Tutorial_name' fa parte dell'espressione CASE in SQL. Il valore di 'Tutorial_name' viene quindi confrontato con ciascun valore WHEN, ovvero 'SQL'... finchรฉ 'Tutorial_name' non corrisponde a un valore WHEN.
Al contrario, l'esempio SEARCH CASE non contiene alcuna espressione CASE:
SELECT Tutorial_ID, Tutorial_name, CASE WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM' WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.' WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.' END AS Description FROM Guru99
Qui, ogni istruzione WHEN ha la propria espressione booleana condizionale. Ogni espressione booleana, ad esempio Tutorial_name = 'SQL'โฆ, viene valutata come VERA/FALSA fino alla prima espressione booleana che risulta VERA.
Differenza tra caso semplice e caso ricercato
| Caso semplice | Caso perquisito |
| La parola chiave CASE รจ immediatamente seguita da CASE_Expression e precede l'istruzione WHEN.
Per esempio: |
La parola chiave CASE รจ seguita dall'istruzione WHEN e non c'รจ alcuna espressione tra CASE e WHEN.
Per esempio: |
| In un caso semplice, esiste un VALORE per ogni istruzione WHEN. Questi valori (Valore_1, Valore_2โฆ) vengono confrontati sequenzialmente con una singola espressione CASE. Il risultato viene valutato in base alla condizione VERO/FALSO per ogni istruzione WHEN.
Per esempio: |
In un caso di ricerca, esiste un'espressione booleana per ogni istruzione WHEN. Queste espressioni booleane (espressione booleana_1, espressione booleana_2โฆ) valutano la condizione VERO/FALSO per ogni istruzione WHEN.
Per esempio: |
| Un caso semplice supporta solo un controllo di uguaglianza, ovvero se CASE_Expression = VALUE_1, VALUE_2โฆ
Per esempio: |
Con Boolean_Expression_N, un Searched Case supporta qualsiasi operazione che restituisca un valore booleano. Sono inclusi gli operatori di uguaglianza e disuguaglianza.
Per esempio: |
CASE nidificato: CASE in IF ELSE
Possiamo usare CASE all'interno di un'istruzione IFโฆELSE. Dichiariamo un variabile per il biglietto aereo e il ramo in base al suo valore. Di seguito รจ riportato un esempio di codice MS-SQL:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 190; IF @Flight_Ticket > 400 PRINT 'Visit Nearby Tourist Location'; ELSE BEGIN SELECT CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END AS Location END
Nell'esempio precedente, l'istruzione CASE รจ annidata all'interno dell'istruzione IFโฆELSE. Innanzitutto, viene eseguita l'istruzione IF e, se la condizione CASE in SQL Server รจ falsa, viene eseguita l'istruzione ELSE. La parte ELSE contiene un'istruzione CASE annidata in SQL. A seconda del valore del biglietto aereo, viene visualizzato uno dei seguenti risultati:
- Il sistema stampa "Visita una localitร turistica nelle vicinanze" se i biglietti aerei costano piรน di 400 dollari.
- Il sistema stampa "Visita Los Angeles" se i biglietti aerei costano tra 0 e 100 dollari.
- Il sistema stampa "Visita New York" se i biglietti aerei costano TRA $101 E $200.
- Il sistema stampa "Visit Europe" se i biglietti aerei costano tra 201 e 400 dollari.
Il risultato seguente mostra la posizione restituita quando l'istruzione CASE annidata viene eseguita all'interno del ramo ELSE:
CASE annidato: CASE all'interno di CASE
In SQL รจ possibile utilizzare l'istruzione CASE all'interno di un'altra istruzione CASE. Di seguito รจ riportato un esempio di codice MS-SQL:
DECLARE @Flight_Ticket int; SET @Flight_Ticket = 250; SELECT CASE WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.' WHEN @Flight_Ticket < 400 THEN CASE WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles' WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York' WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe' END END AS Location
Nell'esempio precedente, l'istruzione CASE รจ annidata all'interno di un'altra istruzione CASE. Il sistema esegue prima l'istruzione CASE esterna; se Flight_Ticket < $400, viene eseguita l'istruzione CASE interna. La destinazione restituita segue gli stessi intervalli di prezzo dei biglietti dell'esempio precedente, quindi un biglietto da $250 rientra nell'intervallo $201โ$400 e restituisce 'Visit Europe'.
Il risultato qui sotto mostra la posizione restituita dal CASE interno per un biglietto da 250 dollari:
CASO con AGGIORNAMENTO
Supponiamo di nuovo di avere il 'GuruTabella da 99' con due colonne e quattro righe, come mostrato di seguito:
Possiamo usare CASE con UPDATE. Di seguito รจ riportato l'esempio di codice MS-SQL:
UPDATE Guru99 SET Tutorial_Name = ( CASE WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.' WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL' WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.' WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.' END )
Nell'esempio precedente, CASE viene utilizzato nell'istruzione UPDATE. A seconda del valore di Tutorial_Name, la colonna Tutorial_Name viene aggiornata con il valore dell'istruzione THEN:
- Se Tutorial_Name = 'SQL', allora aggiorna Tutorial_Name in 'Structured Query language'.
- Se Tutorial_Name = 'PL/SQL', allora aggiorna Tutorial_Name a 'Oracle PL/SQL.
- Se Tutorial_Name = 'MSSQL', allora aggiorna Tutorial_Name a 'Microsoft SQL'.
- Se Tutorial_Name = 'Hadoop', allora aggiorna Tutorial_Name in 'Apache Hadoop'.
L'esecuzione dell'istruzione aggiorna le righe corrispondenti, come mostrato di seguito:
Interroghiamo il 'GuruTabella '99 per verificare i valori aggiornati:
CASO con Ordina per
Possiamo utilizzare CASE con ORDER BY. Di seguito รจ riportato un esempio di codice MS-SQL:
Declare @Order Int; Set @Order = 1 Select * from Guru99 order by CASE WHEN @Order = 1 THEN Tutorial_ID WHEN @Order = 2 THEN Tutorial_Name END DESC
Qui, CASE viene utilizzato con ORDER BY. @Order รจ impostato su 1 e, poichรฉ la prima espressione booleana WHEN risulta vera, Tutorial_ID viene selezionato per la condizione ORDER BY. Il risultato รจ mostrato di seguito:
Fatti interessanti!
- L'istruzione CASE puรฒ essere annidata all'interno di un'altra istruzione CASE, cosรฌ come all'interno di un'istruzione IFโฆELSE.
- Oltre a SELECT, CASE puรฒ essere utilizzato con altre clausole SQL come UPDATE e ORDER BY.













