คำสั่ง 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 ประเภท
- กรณีที่เรียบง่าย
- ค้นหา 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 แถว ดังแสดงด้านล่างนี้:
เราจะใช้ 'กูรู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
แบบสอบถามที่ 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
ค้นหา 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
ผลลัพธ์: แผนภาพด้านล่าง อธิบายขั้นตอนการดำเนินการ ของ กรณีที่ถูกค้นหา กับ ไม่มีอย่างอื่น
ข้อความค้นหา 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 กรณีที่ถูกค้นหา กับ อื่น.
ความแตกต่างระหว่างแนวทางการดำเนินการ: 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 ทันที
เช่น: |
คีย์เวิร์ด Case ตามด้วยคำสั่ง WHEN และไม่มีนิพจน์ระหว่าง CASE และ WHEN
เช่น: |
ในกรณีธรรมดา จะมี VALUE สำหรับแต่ละคำสั่ง WHEN ค่านี้: Value_1, Value_2... ถูกเปรียบเทียบกับ CASE_Expression เดียวตามลำดับ ผลลัพธ์จะได้รับการประเมินสำหรับเงื่อนไข TRUE/FALSE สำหรับแต่ละคำสั่ง WHEN
เช่น: |
ในกรณีที่ค้นหา Boolean_Expression มีอยู่สำหรับแต่ละคำสั่ง WHEN Boolean_Expressions นี้: Boolean_Expression_1, Boolean_Expression_2,... ประเมินเงื่อนไข TRUE/FALSE สำหรับแต่ละคำสั่ง WHEN
เช่น: |
Simple Case รองรับการตรวจสอบความเท่าเทียมกันเท่านั้น เช่น CASE_Expression = VALUE_1, VALUE_2...
เช่น: |
ด้วย Boolean_Expression_N Search Case รองรับการดำเนินการใดๆ ที่ส่งผลให้มีค่าบูลีน ซึ่งรวมถึงตัวดำเนินการเท่ากับและไม่เท่ากับ
เช่น: |
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 ที่ซ้อนกัน: 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
กรณีที่มีการอัปเดต
สมมติฐาน: สมมติว่าเรามีตารางเป็น 'Guru99' โดยมี XNUMX คอลัมน์และ XNUMX แถว ดังแสดงด้านล่าง:
เราจะใช้ตาราง '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'
ลองสอบถามตาราง Guru99 เพื่อตรวจสอบค่าที่อัปเดต:
กรณีที่มีการสั่งซื้อโดย
เราสามารถใช้ 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
ข้อเท็จจริงที่น่าสนใจ!
- CASE สามารถซ้อนกันใน CASE อื่นได้ เช่นเดียวกับในคำสั่ง IF...ELSE อื่น
- นอกจาก SELECT แล้ว CASE ยังสามารถใช้ร่วมกับอีกกรณีหนึ่งได้ SQL ข้อเช่น UPDATE, ORDER BY
สรุป
- ใน MS SQL มี CASE สองประเภท: Simple CASE และ CASE ที่ค้นหา
- ELSE เป็นทางเลือกในคำสั่ง CASE