คำสั่ง CASE และกรณีที่ซ้อนกันใน SQL Server: ตัวอย่าง T-SQL

ภาพรวมเคสในชีวิตจริง!

ขอย้ำอีกครั้งว่าในชีวิตจริง เราทำการกระทำที่แตกต่างกัน ขึ้นอยู่กับผลลัพธ์ของเงื่อนไขที่แตกต่างกัน

หากต้องการอธิบายเพิ่มเติม ให้พิจารณาตัวอย่างด้านล่าง:

  • หากตั๋วเครื่องบินมีราคาต่ำกว่า $100 ฉันจะไปลอสแองเจลิส
  • หากตั๋วเครื่องบินมีราคาระหว่าง $100 ถึง $200 ฉันจะไปนิวยอร์ก
  • หากตั๋วเครื่องบินมีราคาระหว่าง $200 ถึง $400 ฉันจะไปเที่ยวยุโรป
  • ไม่อย่างนั้นฉันจะไปเยี่ยมชมสถานที่ท่องเที่ยวใกล้เคียงมากกว่า

ลองพิจารณาจัดหมวดหมู่ Condition และ Action แยกจากตัวอย่างด้านบนด้านล่าง:

เงื่อนไข - ตั๋วเครื่องบิน การดำเนินการที่ดำเนินการเฉพาะในกรณีที่เงื่อนไขเป็น TRUE
Less มากกว่า $ 100 เยี่ยมชมลอสแองเจลิส
ระหว่าง $ 100 ถึง $ 200 เยี่ยมชมนิวยอร์ก
ระหว่าง $ 200 ถึง $ 400 เที่ยวยุโรป
ไม่ตรงตามเงื่อนไขข้างต้น สถานที่ท่องเที่ยวใกล้เคียง

ในตัวอย่างข้างต้น เราจะเห็นว่าผลลัพธ์ของเงื่อนไขที่แตกต่างกันนั้นควบคุมการกระทำที่แยกจากกัน เช่น ผู้เยี่ยมชมจะดำเนินการเยี่ยมชมนิวยอร์กเฉพาะในเงื่อนไขหากตั๋วเครื่องบินอยู่ระหว่าง $100 ถึง $200

ในทำนองเดียวกัน คำสั่ง MS SQL CASE ยังให้ความสามารถในการดำเนินการดำเนินการคำสั่ง T-SQL ที่แตกต่างกันโดยขึ้นอยู่กับผลลัพธ์ของเงื่อนไขที่แตกต่างกัน

คำสั่ง CASE ใน SQL Server คืออะไร

คำสั่ง CASE ใน SQL Server เป็นส่วนขยายของคำสั่ง IF…ELSE ต่างจาก IF…ELSE ที่อนุญาตให้มีเงื่อนไขได้สูงสุดเพียงเงื่อนไขเดียว CASE อนุญาตให้ผู้ใช้ใช้เงื่อนไขหลายข้อเพื่อดำเนินการชุดการดำเนินการที่แตกต่างกันใน MS SQL โดยจะส่งกลับค่าที่สอดคล้องกันที่เกี่ยวข้องกับเงื่อนไขที่กำหนดโดยผู้ใช้

มาเรียนรู้วิธีใช้ Case ใน SQL และแนวคิดในหัวข้อต่อไปนี้

In MSSQLCASE มี 2 ประเภท

  1. กรณีที่เรียบง่าย
  2. ค้นหา 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]

ที่นี่

  • พารามิเตอร์ Case_Expression หมายถึงการแสดงออกซึ่งในที่สุดเราจะถูกเปรียบเทียบด้วย ค่า_1, ค่า_2, ...
  • พารามิเตอร์ แถลงการณ์_1, แถลงการณ์_2… แสดงถึงคำสั่งที่จะดำเนินการถ้า Case_Expression = Value_1, Case_Expression = Value_2, … และอื่นๆ
  • โดยสรุปก็คือ สภาพ คือว่า Case_Expression = Value_N และ ACTION คือการดำเนินการของ Statement_N ถ้า ผลลัพธ์ข้างต้นคือ TRUE.
  • ALIAS_NAME เป็นทางเลือกและเป็นชื่อนามแฝงที่กำหนดให้กับผลลัพธ์ของคำสั่ง SQL Server CASE ส่วนใหญ่จะใช้เมื่อเราใช้ Case ในส่วนคำสั่งเลือกเซิร์ฟเวอร์ SQL

กฎสำหรับกรณีธรรมดา

  • Simple Case อนุญาตเฉพาะการตรวจสอบความเท่าเทียมกันของ Case_Expression ด้วย Value_1 ถึง Value_N
  • Case_Expression ถูกเปรียบเทียบกับ Value โดยเริ่มจากค่าแรก เช่น Value_1 ด้านล่างเป็นแนวทางการดำเนินการ:
  • ถ้า Case_Expression เทียบเท่ากับ Value_1 ดังนั้นคำสั่ง WHEN…THEN เพิ่มเติมจะถูกข้ามไป และการดำเนินการ CASE จะสิ้นสุดทันที
  • หาก Case_Expression ไม่ตรงกับ Value_1 ดังนั้น Case_Expression จะถูกเปรียบเทียบกับ Value_2 เพื่อความเท่าเทียมกัน กระบวนการเปรียบเทียบ Case_Expression กับ Value นี้จะดำเนินต่อไปจนกว่า Case_Expression จะพบค่าที่เทียบเท่ากันจากชุดของ Value_1, Value_2,...
  • หากไม่มีสิ่งใดที่ตรงกัน การควบคุมจะไปที่คำสั่ง ELSE และ Statement_Else จะถูกดำเนินการ
  • ELSE เป็นทางเลือก
  • หากไม่มี ELSE และ Case_Expression ตรงกับค่าที่ไม่มีค่าใดเลย จะแสดงค่าว่าง

แผนภาพด้านล่างแสดงขั้นตอนการดำเนินการของ Simple Case

การทำงานของคำชี้แจงกรณีอย่างง่าย
การทำงานของคำชี้แจงกรณีอย่างง่าย

ตัวอย่าง

อัสสัมชั: สมมติว่าเรามีตารางเป็น 'กูรู99' โดยแบ่งเป็น 2 คอลัมน์ 4 แถว ดังแสดงด้านล่างนี้:

กรณีอย่างง่ายใน SQL Server

เราจะใช้ 'กูรู99' ตารางในตัวอย่างเพิ่มเติม

แบบสอบถามที่ 1: SIMPLE CASE พร้อมตัวเลือก 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

ผลลัพธ์: แผนภาพด้านล่างอธิบายขั้นตอนการดำเนินการของ SIMPLE CASE ที่ไม่มี ELSE

กรณีอย่างง่ายใน SQL Server

แบบสอบถามที่ 2: SIMPLE CASE พร้อมตัวเลือก 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

ผลลัพธ์: แผนภาพด้านล่างอธิบายขั้นตอนการดำเนินการของ SIMPLE CASE ที่มี ELSE

กรณีอย่างง่ายใน SQL Server

ค้นหา CASE

ไวยากรณ์สำหรับกรณีที่ค้นหา

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]

ที่นี่

  • พารามิเตอร์ Boolean_Expression_1, …หมายถึงนิพจน์ที่จะถูกประเมินว่าเป็น TRUE หรือ FALSE
  • พารามิเตอร์ Statement_1, Statement_2… แสดงถึงคำสั่งที่จะดำเนินการหากผลลัพธ์ Boolean_Expression_1, Boolean_Expression_2 ที่สอดคล้องกันนั้นเป็น TRUE
  • โดยสรุป Condition คือ Boolean_Expression_1,… และ ACTION คือการดำเนินการของ Statement_N หากค่าข้างต้น boolean_Expression_1 เป็น TRUE
  • ALIAS_NAME เป็นทางเลือกและเป็นชื่อนามแฝงที่กำหนดให้กับผลลัพธ์คำสั่ง CASE ส่วนใหญ่จะใช้เมื่อเราใช้ CASE ในส่วนคำสั่งที่เลือก

กฎเกณฑ์สำหรับการสืบค้น

  • ต่างจากกรณีทั่วไป Searched Case ไม่ได้จำกัดอยู่เพียงการตรวจสอบความเท่าเทียมกัน แต่อนุญาตให้ใช้นิพจน์บูลีน
  • นิพจน์บูลีนได้รับการประเมิน ตามลำดับโดยเริ่มจากนิพจน์บูลีนแรก เช่น Boolean_expression_1 ด้านล่างเป็นแนวทางการดำเนินการ:
    • ถ้า Boolean_expression_1 เป็น TRUE คำสั่ง WHEN...THEN เพิ่มเติมจะถูกข้ามไป และการดำเนินการ CASE จะสิ้นสุดทันที
    • หาก Boolean_expression_1 เป็น FALSE ดังนั้น Boolean_expression_2 จะถูกประเมินสำหรับเงื่อนไข TRUE กระบวนการประเมิน Boolean_expression นี้จะดำเนินต่อไปจนกว่า Boolean_expression รายการใดรายการหนึ่งจะส่งกลับค่า TRUE
    • หากไม่มีสิ่งใดที่ตรงกัน การควบคุมจะไปที่คำสั่ง ELSE และ Statement_Else จะถูกดำเนินการ
  • เช่นเดียวกับ Simple Case ELSE เป็นทางเลือกในกรณี Search เช่นกัน
  • ถ้าไม่มี ELSE และไม่มีค่า Boolean_expression ใดส่งคืน TRUE ระบบจะแสดงค่า Null

ด้านล่างแผนภาพ แสดงให้เห็นขั้นตอนการดำเนินการของ ค้นหากรณี.

การทำงานของคำชี้แจงกรณีการค้นหา

การทำงานของคำชี้แจงกรณีการค้นหา

ตัวอย่าง

ข้อความค้นหา 1: ค้นหากรณีด้วยตัวเลือก 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

ผลลัพธ์: แผนภาพด้านล่าง อธิบายขั้นตอนการดำเนินการ ของ กรณีที่ถูกค้นหา กับ ไม่มีอย่างอื่น

ค้นหาตัวอย่าง CASE ใน SQL Server

ข้อความค้นหา 2: กรณีที่ถูกค้นหา กับ 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

ผลลัพธ์: แผนภาพด้านล่าง อธิบายขั้นตอนการดำเนินการ of กรณีที่ถูกค้นหา กับ อื่น.

ค้นหา CASE ใน SQL Server

ความแตกต่างระหว่างแนวทางการดำเนินการ: SIMPLE และ SEARCH CASE

ลองดูที่ กรณีที่เรียบง่าย ตัวอย่างด้านล่าง:

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

ที่นี่ 'ชื่อบทช่วยสอน' เป็นส่วนหนึ่งของนิพจน์ CASE ใน SQL แล้ว 'ชื่อบทช่วยสอน' มูลค่าจะถูกเปรียบเทียบกันในแต่ละ เมื่อค่า เช่น 'SQL'... จนกระทั่ง 'Tutorial_name' ตรงกับค่า WHEN

ในทางตรงกันข้าม, ค้นหากรณี ตัวอย่างไม่มี นิพจน์กรณี:

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

นี่ละ คำสั่งเมื่อ มีของ นิพจน์บูลีนแบบมีเงื่อนไข แต่ละ นิพจน์บูลีน เช่น Tutorial_name = 'SQL',… ได้รับการประเมิน ถูกผิด จนกระทั่ง บูลีนแรก การแสดงออกซึ่งประเมินถึง TRUE.

ความแตกต่างระหว่างกรณีธรรมดาและกรณีการค้นหา

กรณีที่เรียบง่าย ค้นหากรณี
คีย์เวิร์ด CASE ตามด้วย CASE_Expression และก่อนคำสั่ง WHEN ทันที

เช่น:
กรณี
เมื่อ Value_1 แล้ว Statement_1...

คีย์เวิร์ด Case ตามด้วยคำสั่ง WHEN และไม่มีนิพจน์ระหว่าง CASE และ WHEN

เช่น:
กรณีที่ แล้วแถลงการณ์_1…

ในกรณีธรรมดา จะมี VALUE สำหรับแต่ละคำสั่ง WHEN ค่านี้: Value_1, Value_2... ถูกเปรียบเทียบกับ CASE_Expression เดียวตามลำดับ ผลลัพธ์จะได้รับการประเมินสำหรับเงื่อนไข TRUE/FALSE สำหรับแต่ละคำสั่ง WHEN

เช่น:
กรณี
เมื่อ Value_1 แล้ว Statement_1...
เมื่อ Value_2 แล้ว Statement_2...

ในกรณีที่ค้นหา Boolean_Expression มีอยู่สำหรับแต่ละคำสั่ง WHEN Boolean_Expressions นี้: Boolean_Expression_1, Boolean_Expression_2,... ประเมินเงื่อนไข TRUE/FALSE สำหรับแต่ละคำสั่ง WHEN

เช่น:
กรณี
เมื่อไร แล้วแถลงการณ์_1…
เมื่อไร แล้วแถลงการณ์_2…

Simple Case รองรับการตรวจสอบความเท่าเทียมกันเท่านั้น เช่น CASE_Expression = VALUE_1, VALUE_2...

เช่น:
กรณี WHEN Value_1 THEN Statement_1… ในตัวอย่างข้างต้น การดำเนินการเดียวที่ระบบดำเนินการคือการตรวจสอบว่า Case_Expression = Value_1 หรือไม่

ด้วย Boolean_Expression_N Search Case รองรับการดำเนินการใดๆ ที่ส่งผลให้มีค่าบูลีน ซึ่งรวมถึงตัวดำเนินการเท่ากับและไม่เท่ากับ

เช่น:
กรณีที่ คำสั่ง THEN_1… ในตัวอย่างข้างต้น Boolean_Expression_1 สามารถประกอบด้วยตัวดำเนินการทั้ง 'เท่ากับ' และ 'ไม่เท่ากับ' ได้ เช่น A = B, A != B

CASE ที่ซ้อนกัน: CASE ใน IF ELSE

เราสามารถใช้ กรณีภายใน IF ELSE- ด้านล่างนี้คือตัวอย่างโค้ด 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

ในตัวอย่างข้างต้น CASE ซ้อนอยู่ภายในคำสั่ง IF...ELSE:

ขั้นแรก คำสั่ง IF จะดำเนินการและหากเงื่อนไขของกรณีเข้ามา เซิร์ฟเวอร์ SQL เป็นเท็จ จากนั้นคำสั่ง ELSE จะดำเนินการ

หรือจะใส่คำสั่ง CASE แบบซ้อนใน SQL ไว้ก็ได้ ขึ้นอยู่กับมูลค่าตั๋วเครื่องบิน ผลลัพธ์หนึ่งจากรายการต่อไปนี้จะปรากฏขึ้น:

  • ระบบจะพิมพ์ 'เยี่ยมชมสถานที่ท่องเที่ยวใกล้เคียง' หากตั๋วเครื่องบินมีมูลค่า > $400
  • ระบบจะพิมพ์ 'Visit Los Angeles' หากตั๋วเครื่องบินอยู่ระหว่าง $0 ถึง $100
  • ระบบจะพิมพ์ 'Visit New York' หากตั๋วเครื่องบินอยู่ระหว่าง $101 ถึง $200
  • ระบบจะพิมพ์ 'Visit Europe' หากตั๋วเครื่องบินมีราคาระหว่าง $201 ถึง $400

CASE ที่ซ้อนกันใน SQL Server

CASE ที่ซ้อนกัน: CASE ภายใน CASE

เราสามารถใช้ CASE ภายใน CASE ใน SQL ด้านล่างนี้คือตัวอย่างโค้ด 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

ในตัวอย่างข้างต้น CASE ซ้อนกันอยู่ในคำสั่ง CASE อื่น:

ระบบเริ่มต้นด้วยการดำเนินการ CASE ภายนอก หาก Flight_Ticket < $400 CASE ภายในจะดำเนินการ

ขึ้นอยู่กับมูลค่าตั๋วเครื่องบิน จะมีการแสดงผลลัพธ์หนึ่งอย่างต่อไปนี้:

  • ระบบจะพิมพ์ 'เยี่ยมชมสถานที่ท่องเที่ยวใกล้เคียง' หากตั๋วเครื่องบินมีมูลค่า > $400
  • ระบบจะพิมพ์ 'Visit Los Angeles' หากตั๋วเครื่องบินอยู่ระหว่าง $0 ถึง $100
  • ระบบจะพิมพ์ 'Visit New York' หากตั๋วเครื่องบินอยู่ระหว่าง $101 ถึง $200
  • ระบบจะพิมพ์ 'Visit Europe' หากตั๋วเครื่องบินมีราคาระหว่าง $201 ถึง $400

ตัวอย่าง CASE ที่ซ้อนกันใน SQL Server

กรณีที่มีการอัปเดต

สมมติฐาน: สมมติว่าเรามีตารางเป็น 'Guru99' โดยมี XNUMX คอลัมน์และ XNUMX แถว ดังแสดงด้านล่าง:

กรณีที่มี UPDATE ใน SQL Server

เราจะใช้ตาราง 'Guru99' ในตัวอย่างเพิ่มเติม

เราสามารถใช้ CASE กับ UPDATE ได้ ด้านล่างนี้คือตัวอย่างโค้ด 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
	)

ในตัวอย่างข้างต้น CASE ใช้ในคำสั่ง UPDATE

ขึ้นอยู่กับค่า Tutorial_Name คอลัมน์ Tutorial_Name จะได้รับการอัปเดตด้วยค่าคำสั่ง THEN

  • หาก Tutorial_Name = 'SQL' จากนั้นอัปเดต Tutorial_Name เป็น 'ภาษาแบบสอบถามที่มีโครงสร้าง'
  • หาก Tutorial_Name = 'PL/SQL' ให้อัพเดต Tutorial_Name เป็น 'Oracle PL/SQL'
  • หาก Tutorial_Name = 'MSSQL' จากนั้นอัปเดต Tutorial_Name เป็น 'Microsoft เอสคิวแอล'
  • หาก Tutorial_Name = 'Hadoop' จากนั้นอัปเดต Tutorial_Name เป็น 'Apache Hadoop'

กรณีที่มี UPDATE ใน SQL Server

ลองสอบถามตาราง Guru99 เพื่อตรวจสอบค่าที่อัปเดต:

กรณีที่มี UPDATE ใน SQL Server

กรณีที่มีการสั่งซื้อโดย

เราสามารถใช้ CASE กับ Order By ด้านล่างนี้คือตัวอย่างโค้ด 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

ในที่นี้ CASE ใช้กับ Order By

@Order ถูกตั้งค่าเป็น 1 และเป็นครั้งแรกเมื่อนิพจน์บูลีนประเมินเป็น TRUE, Tutorial_ID จะถูกเลือกสำหรับ Order by Condition

กรณีที่มีการเรียงลำดับตามใน SQL Server

ข้อเท็จจริงที่น่าสนใจ!

  • CASE สามารถซ้อนกันใน CASE อื่นได้ เช่นเดียวกับในคำสั่ง IF...ELSE อื่น
  • นอกจาก SELECT แล้ว CASE ยังสามารถใช้ร่วมกับอีกกรณีหนึ่งได้ SQL ข้อเช่น UPDATE, ORDER BY

สรุป

  • ใน MS SQL มี CASE สองประเภท: Simple CASE และ CASE ที่ค้นหา
  • ELSE เป็นทางเลือกในคำสั่ง CASE