CASE Statement & Nested Case i SQL Server: T-SQL Exempel

ร–versikt รถver Case i verkliga livet!

ร…terigen, i det verkliga livet utfรถr vi olika handlingar beroende pรฅ resultatet av olika tillstรฅnd.

Fรถr att utveckla mer, รถvervรคg nedanstรฅende exempel:

  • Om flygbiljetterna รคr mindre รคn $100, dรฅ kommer jag att besรถka Los Angeles.
  • Om flygbiljetterna รคr mellan $100 till $200, dรฅ kommer jag att besรถka New York
  • Om flygbiljetterna รคr mellan $200 till $400, dรฅ kommer jag att besรถka Europa
  • Annars fรถredrar jag att besรถka nรฅgon nรคrliggande turistplats.

Lรฅt oss รถvervรคga att kategorisera tillstรฅnd och รฅtgรคrd separat frรฅn exemplet ovan nedan:

Betingelser - Flygbiljetter ร…tgรคrder utfรถrda, endast om skick รคr SANN
Less รคn $ 100 Besรถk Los Angeles
Mellan $ 100 till $ 200 Besรถk New York
Mellan $ 200 till $ 400 Besรถk Europa
Inget av ovanstรฅende villkor uppfylldes Nรคrliggande turistplats

I exemplet ovan kan vi se att resultatet av de olika villkoren styr separata รฅtgรคrder. Besรถkaren kommer till exempel att utfรถra handlingen att besรถka New York endast i det skicket om flygbiljetten รคr mellan $100 och $200.

Pรฅ samma sรคtt ger MS SQL CASE-satsen ocksรฅ mรถjligheten att vidta รฅtgรคrder fรถr att exekvera olika T-SQL-satser baserat pรฅ resultatet av olika tillstรฅnd.

Vad รคr CASE Statement i SQL Server?

CASE-uttalande i SQL Server รคr fรถrlรคngningen av IF...ELSE-satsen. Till skillnad frรฅn IFโ€ฆELSE, dรคr endast maximalt ett villkor รคr tillรฅtet, tillรฅter CASE anvรคndaren att tillรคmpa flera villkor fรถr att utfรถra olika uppsรคttningar av รฅtgรคrder i MS SQL. Den returnerar ett motsvarande vรคrde som รคr associerat med villkoret som definierats av anvรคndaren.

Lรฅt oss lรคra oss hur man anvรคnder Case i SQL och dess koncept i fรถljande avsnitt.

In MSSQL, det finns tvรฅ typer av CASE.

  1. Enkelt FALL
  2. Sรถkte i CASE

Enkelt FALL

Syntaxen fรถr Simple Case

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]

Hรคr,

  • Parametern Case_Expression betecknar uttrycket som vi sรฅ smรฅningom kommer att jรคmfรถras med Vรคrde_1, Vรคrde_2, ...
  • Parametrarna Statement_1, Statement_2โ€ฆ anger de uttalanden som kommer att utfรถras om Case_Expression = Value_1, Case_Expression = Value_2, โ€ฆ och sรฅ vidare.
  • I ett nรถtskal tillstรฅnd รคr om Case_Expression = Value_N och ACTION รคr exekveringen av Statement_N om ovanstรฅende resultat รคr SANT.
  • ALIAS NAMN รคr valfritt och รคr det alias som ges till resultatet av SQL Server CASE-satsen. Anvรคnds mest nรคr vi anvรคnder Case i SQL-servervalsklausulen.

Regler fรถr Simple Case

  • Enkelt fall tillรฅter endast likhetskontroll av Case_Expression med Value_1 till Value_N.
  • Case_Expression jรคmfรถrs med Value, i ordning frรฅn det fรถrsta vรคrdet, dvs. Value_1. Nedan รคr utfรถrandemetoden:
  • Om Case_Expression รคr ekvivalent med Value_1, hoppas ytterligare WHENโ€ฆTHEN-satser รถver, och CASE-kรถrningen AVSLUTAS omedelbart.
  • Om Case_Expression inte matchar med Value_1 jรคmfรถrs Case_Expression med Value_2 fรถr ekvivalens. Denna process att jรคmfรถra Case_Expression med Value kommer att fortsรคtta tills Case_Expression hittar motsvarande motsvarande vรคrde frรฅn uppsรคttningen Value_1, Value_2,...
  • Om inget matchar, gรฅr kontrollen till ELSE-satsen, och Statement_Else kommer att exekveras.
  • ANNAT รคr valfritt.
  • Om ELSE inte finns och Case_Expression matchar med inget av vรคrdena, dรฅ Null kommer att visas.

Diagrammet nedan illustrerar exekveringsflรถdet fรถr Simple Case.

Working of Simple Case Statement
Working of Simple Case Statement

Exempel

Antagande: Antag att vi har tabellen som 'Guru99 ' med tvรฅ kolumner och fyra rader som visas nedan:

Enkelt fall i SQL Server

Vi kommer anvรคnda 'Guru99 ' tabell i ytterligare exempel

Frรฅga 1: ENKEL FALL med alternativet INGEN ANNAT

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

Resultat: Diagrammet nedan fรถrklarar exekveringsflรถdet fรถr ett ENKELT FALL UTAN ANNAT.

Enkelt fall i SQL Server

Frรฅga 2: ENKEL FALL med alternativet ANNAT.

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

Resultat: Diagrammet nedan fรถrklarar exekveringsflรถdet fรถr ett ENKELT CASE med ELSE.

Enkelt fall i SQL Server

Sรถkte i CASE

Syntaxen fรถr sรถkta fall

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]

Hรคr,

  • Parametern Boolean_Expression_1, โ€ฆ anger uttrycket som kommer att utvรคrderas fรถr TRUE eller FALSE.
  • Parametrarna Statement_1, Statement_2โ€ฆ anger de pรฅstรฅenden som kommer att kรถras om dess motsvarande Boolean_Expression_1, Boolean_Expression_2 resultat รคr TRUE.
  • I ett nรถtskal รคr Condition Boolean_Expression_1,... och ACTION รคr exekveringen av Statement_N om ovan boolean_Expression_1 รคr TRUE.
  • ALIAS_NAME รคr valfritt och รคr aliasnamnet som ges till CASE-satsresultatet. Anvรคnds oftast nรคr vi anvรคnder CASE i select-satsen.

Regler fรถr genomsรถkt รคrende

  • Till skillnad frรฅn det enkla fallet รคr Searched Case inte begrรคnsad till enbart likhetskontroll utan tillรฅter booleska uttryck.
  • Det booleska uttrycket utvรคrderas i ordning frรฅn det fรถrsta booleska uttrycket, dvs booleskt_uttryck_1. Nedan รคr utfรถrandemetoden:
    • Om Boolean_expression_1 รคr TRUE, hoppas ytterligare WHEN...THEN-satser รถver, och CASE-exekveringen AVSLUTAS omedelbart.
    • Om Boolean_expression_1 รคr FALSE, utvรคrderas Boolean_expression_2 fรถr TRUE-tillstรฅnd. Denna process att bedรถma Boolean_expression kommer att fortsรคtta tills ett av Boolean_expression returnerar TRUE.
    • Om inget matchar, gรฅr kontrollen till ELSE-satsen, och Statement_Else kommer att exekveras.
  • Like Simple Case ANNAT รคr valfritt i sรถkfall ocksรฅ.
  • Om ELSE inte finns och inget av Boolean_expression returnerar TRUE, kommer Null att visas.

Diagram nedan illustrera exekveringsflรถdet av Sรถkte i Case.

Arbete med sรถkt รคrendeutlรฅtande

Arbete med sรถkt รคrendeutlรฅtande

Exempel

Frรฅga 1: Sร–KTADE FALL med alternativet INGEN ANNAT

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

Resultat: Nedanstรฅende diagram fรถrklarar exekveringsflรถdet av Sร–KT FALL med INGEN ANNAT.

Sรถkte efter CASE-exempel i SQL Server

Frรฅga 2: Sร–KT FALL med ANNARS alternativ.

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

Resultat: Nedanstรฅende diagram fรถrklarar exekveringsflรถdet of DET Sร–KADE FALLET med ANNAN.

Sรถkte efter CASE i SQL Server

Skillnad mellan exekveringsmetod: SIMPLE och SEARCH CASE.

Lรฅt oss ta en titt pรฅ ENKEL FALL exempel nedan:

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

Hรคr, "Tutorial_name" รคr en del av CASE-uttryck i SQL. Sedan "Tutorial_name" vรคrdet jรคmfรถrs med varje Nร„R vรคrden, dvs 'SQL'... tills 'Tutorial_name' matchar WHEN-vรคrdena.

Tvรคrtom, Sร–K FALL exemplet har nr CASE-uttryck:

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

Hรคr, var och en Nร„R uttalande har sin Villkorligt booleskt uttryck. Varje booleskt uttryck dvs. Tutorial_name = 'SQL',... utvรคrderas fรถr SANT FALSKT tills fรถrsta booleska uttryck som utvรคrderar till SANN.

Skillnaden mellan enkelt och sรถkt fall

Enkelt fall Sรถkte i Case
CASE-nyckelordet fรถljs omedelbart av CASE_Expression och fรถre WHEN-satsen.

T.ex:
FALL
Nร„R Vรคrde_1 Dร… Uttalande_1...

Case-nyckelordet fรถljs av WHEN-satsen, och det finns inget uttryck mellan CASE och WHEN.

T.ex:
FALL Nร„R Dร… Uttalande_1...

I enkla fall finns VALUE fรถr varje WHEN-sats. Dessa vรคrden: Value_1, Value_2โ€ฆ Jรคmfรถrs med enstaka CASE_Expression sekventiellt. Resultatet utvรคrderas fรถr TRUE/FALSE-villkoret fรถr varje WHEN-pรฅstรฅende.

T.ex:
FALL
Nร„R Vรคrde_1 Dร… Uttalande_1...
Nร„R Vรคrde_2 Dร… Uttalande_2...

I sรถkt fall finns Boolean_Expression fรถr varje WHEN-sats. Detta Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,... utvรคrderar TRUE/FALSE-villkoret fรถr varje WHEN-sats.

T.ex:
CASE
Nร„R Dร… Uttalande_1...
Nร„R Dร… Uttalande_2...

Simple Case stรถder endast jรคmstรคlldhetskontroll. Dvs om CASE_Expression = VALUE_1, VALUE_2...

T.ex:
FALL WHEN Value_1 THEN Statement_1...I exemplet ovan รคr den enda operation som utfรถrs av systemet att kontrollera om Case_Expression = Value_1

Med Boolean_Expression_N stรถder Search Case alla operationer som resulterar i ett booleskt vรคrde. Det inkluderar lika och inte lika med operator.

T.ex:
FALL Nร„R THEN Statement_1... I ovanstรฅende exempel kan Boolean_Expression_1 innehรฅlla bรฅde "lika med" och "inte lika med" operatorn som A = B, A != B.

Kapslad CASE: CASE in IF ELSE

Vi kan anvรคnda CASE inuti OM ANNAT. Nedan รคr exempel pรฅ MS-SQL-koden

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

I exemplet ovan รคr CASE NESTAD inuti IFโ€ฆELSE-satsen:

Fรถrst kommer IF-utlรฅtandet att kรถras och om รคrendet รคr i SQL-server รคr False kommer ELSE-satsen att kรถras.

Annars innehรฅller kapslad CASE-sats i SQL inuti den. Beroende pรฅ flygbiljettens vรคrde kommer ett av fรถljande resultat att visas:

  • Systemet kommer att skriva ut "Besรถk nรคrliggande turistplats" om flygbiljetterna รคr > $400
  • Systemet kommer att skriva ut "Visit Los Angeles" om flygbiljetterna รคr MELLAN $0 OCH $100
  • Systemet kommer att skriva ut "Visit New York" om flygbiljetter รคr MELLAN $101 OCH $200
  • Systemet kommer att skriva ut "Visit Europe" om flygbiljetterna รคr MELLAN $201 OCH $400

Kapslade CASE i SQL Server

Kapslad CASE: CASE inuti CASE

Vi kan anvรคnda CASE inuti CASE i SQL. Nedan รคr exempel pรฅ MS-SQL-koden

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

I exemplet ovan รคr CASE NESTAD i en annan CASE-sats:

Systemet bรถrjar med att exekvera det yttre CASE. Om Flight_Ticket < $400 kommer inner CASE att kรถras.

Beroende pรฅ flygbiljettens vรคrde kommer ett av fรถljande resultat att visas:

  • Systemet kommer att skriva ut "Besรถk nรคrliggande turistplats" om flygbiljetterna รคr > $400
  • Systemet kommer att skriva ut "Visit Los Angeles" om flygbiljetterna รคr MELLAN $0 OCH $100
  • Systemet kommer att skriva ut "Visit New York" om flygbiljetter รคr MELLAN $101 OCH $200
  • Systemet kommer att skriva ut "Visit Europe" om flygbiljetterna รคr MELLAN $201 OCH $400

Kapslat CASE-exempel i SQL Server

FALL med UPPDATERING

Antagande: Antag att vi har tabellen som 'Guru99' med tvรฅ kolumner och fyra rader som visas nedan:

CASE med UPPDATERING i SQL Server

Vi kommer att anvรคnda 'Guru99'-bord i ytterligare exempel

Vi kan anvรคnda CASE med UPDATE. Nedan รคr exempel pรฅ MS-SQL-koden:

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
	)

I exemplet ovan anvรคnds CASE i UPDATE-satsen.

Beroende pรฅ Tutorial_Name Value, kommer Tutorial_Name-kolumnen att fรฅ uppdateringen med THEN Statement-vรคrdet.

  • Om Tutorial_Name = 'SQL' uppdatera Dร… Tutorial_Name till 'Structured Query language'
  • Om Tutorial_Name = 'PL/SQL' uppdatera Dร… Tutorial_Name till 'Oracle PL/SQL'
  • Om Tutorial_Name = 'MSSQL' uppdatera Dร… Tutorial_Name till 'Microsoft SQL'
  • Om Tutorial_Name = 'Hadoop' uppdatera Dร… Tutorial_Name till 'Apache Hadoop'

CASE med UPPDATERING i SQL Server

Lรฅt oss frรฅga Guru99-tabellen fรถr att kontrollera det uppdaterade vรคrdet:

CASE med UPPDATERING i SQL Server

FALL med Bestรคll av

Vi kan anvรคnda CASE med Order By. Nedan รคr exempel pรฅ MS-SQL-koden:

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

Hรคr anvรคnds CASE med Order By.

@Order รคr satt till 1 och som fรถrst Nร„R det booleska uttrycket utvรคrderas till TRUE, vรคljs Tutorial_ID fรถr Order by Condition

CASE med Order by i SQL Server

Intressanta fakta!

  • CASE kan kapslas i ett annat CASE sรฅvรคl som i en annan IFโ€ฆELSE-sats.
  • Fรถrutom SELECT kan CASE anvรคndas med en annan SQL klausul som UPDATE, ORDER BY.

Sammanfattning

  • I MS SQL finns det tvรฅ typer av CASE: Simple CASE och Searched CASE
  • ELSE รคr valfritt i CASE-satsen.

Sammanfatta detta inlรคgg med: