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.

  • ๐Ÿงญ Valore condizionale: Un'espressione CASE restituisce un valore che dipende da quale condizione WHEN viene valutata per prima come vera.
  • 1๏ธโƒฃ Caso semplice: L'istruzione CASE semplice confronta un'espressione con un elenco di valori ed esegue un controllo di uguaglianza per ogni WHEN.
  • ๐Ÿ”Ž CASO ricercato: La funzione CASE cercata valuta un'espressione booleana separata per ogni WHEN, supportando intervalli e operatori di disuguaglianza.
  • โž– ELSE รจ facoltativo: Quando non viene trovata alcuna corrispondenza con WHEN e ELSE viene omesso, l'espressione CASE restituisce NULL.
  • ๐Ÿช† Nidificazione: L'istruzione CASE puรฒ essere annidata all'interno di un'altra istruzione CASE e all'interno di un'istruzione IFโ€ฆELSE per una logica multilivello.
  • ๐Ÿ”ง Oltre SELECT: Oltre a SELECT, CASE funziona con le clausole UPDATE e ORDER BY per gestire aggiornamenti condizionali e ordinamenti.

Istruzioni CASE e CASE annidate in SQL Server con esempi in T-SQL

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:

Diagramma di flusso che mostra come un CASE semplice valuta ciascun valore WHEN in ordine

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.

Campione GuruTabella 99 con colonne Tutorial_ID e Tutorial_name e quattro righe

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.

Risultato di un CASO semplice senza ELSE, che mostra un Descriptione per ogni Tutorial_name

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.

Risultato di un semplice CASE con ELSE, che restituisce il testo predefinito per le righe non corrispondenti.

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:

Diagramma di flusso che mostra come un CASE cercato valuta ogni espressione booleana in ordine

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.

Risultato di un CASO cercato senza ELSE, che corrisponde a ciascun Tutorial_name a un Descriptione

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.

Risultato di un CASE cercato con ELSE, che restituisce il testo predefinito per i linguaggi non SQL

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:
CASO
QUANDO Valore_1 THEN Istruzione_1โ€ฆ

La parola chiave CASE รจ seguita dall'istruzione WHEN e non c'รจ alcuna espressione tra CASE e WHEN.

Per esempio:
CASO QUANDO QUINDI Dichiarazione_1โ€ฆ

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:
CASO
QUANDO Valore_1 THEN Istruzione_1โ€ฆ
QUANDO Valore_2 THEN Istruzione_2โ€ฆ

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:
CASI
QUANDO ALLORA Dichiarazione_1...
QUANDO ALLORA Dichiarazione_2...

Un caso semplice supporta solo un controllo di uguaglianza, ovvero se CASE_Expression = VALUE_1, VALUE_2โ€ฆ

Per esempio:
CASO QUANDO Valore_1 ALLORA Istruzione_1โ€ฆ
Nell'esempio precedente, l'unica operazione eseguita dal sistema รจ verificare se Case_Expression = Value_1.

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:
CASO QUANDO QUINDI Dichiarazione_1โ€ฆ
Nell'esempio precedente, Boolean_Expression_1 puรฒ contenere sia l'operatore 'uguale a' che l'operatore 'diverso da', come A = B, A != B.

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:

Risultato di un CASE annidato all'interno di un IFโ€ฆELSE, che stampa la posizione della visita per il biglietto

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:

Risultato di un CASO annidato all'interno di un altro CASO, che restituisce Visita l'Europa per un biglietto da 250

CASO con AGGIORNAMENTO

Supponiamo di nuovo di avere il 'GuruTabella da 99' con due colonne e quattro righe, come mostrato di seguito:

Guru99 tabella prima dell'AGGIORNAMENTO CASE, che mostra i valori originali di Tutorial_Name

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:

Risultato dell'esecuzione dell'istruzione CASE UPDATE su GuruTabella 99

Interroghiamo il 'GuruTabella '99 per verificare i valori aggiornati:

Guru99 tabella dopo l'aggiornamento CASE, che mostra i nuovi valori di Tutorial_Name

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:

Risultato di ORDER BY con un'espressione CASE che ordina il Guru99 tabella per Tutorial_ID

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.

DOMANDE FREQUENTI

IIF() รจ una forma abbreviata per un'espressione CASE a due risultati: restituisce un valore quando la condizione รจ vera e un altro quando รจ falsa. Un'espressione CASE completa รจ piรน flessibile e puรฒ testare molte condizioni WHEN in un'unica istruzione.

Sรฌ. Poichรฉ CASE restituisce un valore, puรฒ comparire in un elenco SELECT, in una clausola WHERE, in una clausola HAVING e in GROUP BY. In una clausola WHERE, CASE consente di applicare una logica di filtro diversa a seconda dei valori delle altre colonne.

Sรฌ. Inserire un'espressione CASE all'interno di SUM(), COUNT() o AVG() esegue l'aggregazione condizionale, totalizzando o contando solo le righe che corrispondono a ciascuna condizione WHEN. Questa tecnica viene spesso utilizzata per creare report di riepilogo in stile pivot.

COALESCE e ISNULL restituiscono solo il primo valore non NULL da una lista. Un'espressione CASE รจ piรน ampia: valuta condizioni booleane arbitrarie o corrispondenze di valori e restituisce il risultato del primo ramo che รจ vero.

Un'espressione CASE restituisce un singolo tipo di dati. SQL Server lo determina in base alla precedenza dei tipi di dati di ogni risultato THEN ed ELSE, quindi tutti i rami devono restituire tipi compatibili per evitare errori di conversione.

Sรฌ. Un'espressione CASE puรฒ comparire nell'istruzione SELECT di una vista e in qualsiasi punto all'interno di una stored procedure, funzione o trigger. La stessa sintassi dell'espressione funziona per tutti questi oggetti.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub รˆ possibile creare espressioni CASE semplici e con ricerca, incluse espressioni CASE annidate e CASE all'interno di UPDATE, tramite un prompt in linguaggio naturale. Prima di eseguire la query, รจ sempre necessario rivedere le condizioni WHEN, l'ordine dei salti e la gestione di ELSE.

Gli assistenti basati sull'intelligenza artificiale e sull'apprendimento automatico traducono le regole in linguaggio naturale in espressioni CASE semplici o ricercate, suggeriscono i rami WHEN mancanti e segnalano le sovrapposizioni.ping o condizioni irraggiungibili. Lo sviluppatore verifica la correttezza di ogni suggerimento prima di implementarlo.

Riassumi questo post con: