คำสั่ง CASE และกรณีที่ซ้อนกันใน SQL Server: ตัวอย่าง T-SQL
⚡ สรุปอย่างชาญฉลาด
CASE เป็นนิพจน์เงื่อนไขใน SQL Server ที่ส่งคืนค่าตามเงื่อนไขแรกที่ประเมินค่าเป็นจริง โดยมีรูปแบบการใช้งานทั้งแบบง่าย (Simple) และแบบค้นหา (Searched) รวมถึงการซ้อนภายใน IF…ELSE, UPDATE และ ORDER BY

ภาพรวมเคสในชีวิตจริง!
ในชีวิตจริง เราจะกระทำการต่างๆ กันไป ขึ้นอยู่กับผลลัพธ์ของสถานการณ์ที่แตกต่างกัน เพื่ออธิบายให้ชัดเจนยิ่งขึ้น ลองพิจารณาตัวอย่างด้านล่างนี้:
- หากตั๋วเครื่องบินมีราคาต่ำกว่า $100 ฉันจะไปลอสแองเจลิส
- ถ้าตั๋วเครื่องบินราคาอยู่ระหว่าง 100 ถึง 200 ดอลลาร์ ฉันจะไปนิวยอร์ก
- ถ้าตั๋วเครื่องบินราคาอยู่ระหว่าง 200 ถึง 400 ดอลลาร์สหรัฐ ฉันจะไปเที่ยวยุโรป
- มิเช่นนั้น ฉันคงเลือกที่จะไปเที่ยวสถานที่ท่องเที่ยวใกล้เคียงแทน
ลองพิจารณาแยกประเภทเงื่อนไขและการกระทำออกจากกันจากตัวอย่างข้างต้น:
| เงื่อนไข – ตั๋วเครื่องบิน | การกระทำจะเกิดขึ้นก็ต่อเมื่อเงื่อนไขเป็นจริงเท่านั้น |
| Less มากกว่า $ 100 | เยี่ยมชมลอสแองเจลิส |
| ระหว่าง $ 100 ถึง $ 200 | เยี่ยมชมนิวยอร์ก |
| ระหว่าง $ 200 ถึง $ 400 | เที่ยวยุโรป |
| ไม่ตรงตามเงื่อนไขข้างต้น | สถานที่ท่องเที่ยวใกล้เคียง |
จากตัวอย่างข้างต้น เราจะเห็นว่าผลลัพธ์ของเงื่อนไขที่แตกต่างกันนั้นส่งผลต่อการกระทำที่แยกจากกัน ตัวอย่างเช่น นักท่องเที่ยวจะเดินทางไปนิวยอร์กก็ต่อเมื่อตั๋วเครื่องบินมีราคาอยู่ระหว่าง 100 ถึง 200 ดอลลาร์เท่านั้น ในทำนองเดียวกัน MSSQL คำสั่ง CASE ยังมีคุณสมบัติในการเรียกใช้คำสั่ง T-SQL ที่แตกต่างกันไปตามผลลัพธ์ของเงื่อนไขต่างๆ อีกด้วย
คำสั่ง CASE ใน SQL Server คืออะไร
คำชี้แจงกรณีใน SQL Server เป็นส่วนขยายของ ถ้า…อย่างอื่น คำสั่ง CASE แตกต่างจาก IF…ELSE ที่อนุญาตให้ใช้เงื่อนไขได้สูงสุดเพียงเงื่อนไขเดียวเท่านั้น CASE อนุญาตให้ผู้ใช้กำหนดเงื่อนไขได้หลายเงื่อนไขเพื่อดำเนินการต่างๆ ใน MS SQL โดยจะส่งคืนค่าที่สอดคล้องกับเงื่อนไขที่ผู้ใช้กำหนด
เรามาเรียนรู้วิธีการใช้คำสั่ง CASE กัน SQL และแนวคิดของมันในหัวข้อต่อไปนี้ ใน MS SQL มี CASE สองประเภท:
- กรณีที่เรียบง่าย
- ค้นหา 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 ระบุถึงนิพจน์ที่จะถูกนำไปเปรียบเทียบกับ Value_1, Value_2 และอื่นๆ ต่อไป
- พารามิเตอร์ Statement_1, Statement_2… แสดงถึงคำสั่งที่จะถูกดำเนินการหาก Case_Expression = Value_1, Case_Expression = Value_2 และอื่นๆ
- โดยสรุป เงื่อนไขคือว่า Case_Expression เท่ากับ Value_N หรือไม่ และการกระทำคือการเรียกใช้ Statement_N หากผลลัพธ์ข้างต้นเป็นจริง
- ALIAS_NAME เป็นตัวเลือกเสริม และเป็นชื่อแทนที่กำหนดให้กับผลลัพธ์ของคำสั่ง CASE ใน SQL Server โดยส่วนใหญ่จะใช้เมื่อเราใช้ CASE ในส่วน SELECT ของ SQL Server
กฎสำหรับกรณีธรรมดา
- Simple Case อนุญาตให้ตรวจสอบความเท่าเทียมกันของ Case_Expression กับ Value_1 ถึง Value_N เท่านั้น
- Case_Expression จะถูกเปรียบเทียบกับค่าตามลำดับ โดยเริ่มจากค่าแรก คือ Value_1 วิธีการดำเนินการมีดังนี้:
- ถ้า Case_Expression เทียบเท่ากับ Value_1 ดังนั้นคำสั่ง WHEN…THEN เพิ่มเติมจะถูกข้ามไป และการดำเนินการ CASE จะสิ้นสุดทันที
- ถ้า Case_Expression ไม่ตรงกับ Value_1 ระบบจะเปรียบเทียบ Case_Expression กับ Value_2 เพื่อหาค่าที่เท่ากัน กระบวนการเปรียบเทียบ Case_Expression กับค่าต่างๆ นี้จะดำเนินต่อไปจนกว่า Case_Expression จะพบค่าที่ตรงกันจากชุดของ Value_1, Value_2 และอื่นๆ ต่อไป
- หากไม่มีสิ่งใดตรงกัน ระบบจะโอนการควบคุมไปยังคำสั่ง ELSE และจะทำการเรียกใช้ Statement_Else
- ELSE เป็นทางเลือก
- หากไม่มีคำสั่ง ELSE และ Case_Expression ไม่ตรงกับค่าใดๆ เลย ระบบจะแสดงค่า NULL
แผนภาพด้านล่างแสดงลำดับการทำงานของกรณีตัวอย่างแบบง่าย:
ตัวอย่าง
สมมติว่าเรามีตารางชื่อ 'Guruตาราง '99' ประกอบด้วยสองคอลัมน์ คือ Tutorial_ID และ Tutorial_name และสี่แถว ดังแสดงด้านล่าง เราจะใช้ตารางนี้ 'Guruตาราง 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: กรณีง่ายๆ พร้อมตัวเลือก 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
- โดยสรุป เงื่อนไขคือ Boolean_Expression_1… และการกระทำคือการดำเนินการตาม Statement_N หาก Boolean_Expression_1 ข้างต้นเป็นจริง
- ALIAS_NAME เป็นตัวเลือกเสริม และเป็นชื่อแทนที่กำหนดให้กับผลลัพธ์ของคำสั่ง CASE โดยส่วนใหญ่จะใช้เมื่อเราใช้ CASE ในส่วน SELECT
กฎเกณฑ์สำหรับการสืบค้น
- แตกต่างจาก Simple Case ตรงที่ Searched Case ไม่ได้จำกัดอยู่แค่การตรวจสอบความเท่าเทียมกันเท่านั้น แต่ยังอนุญาตให้ใช้ค่าบูลีนได้ด้วย
- นิพจน์บูลีนจะถูกประเมินตามลำดับ โดยเริ่มจากนิพจน์บูลีนแรก นั่นคือ Boolean_Expression_1 วิธีการดำเนินการมีดังนี้:
- ถ้า Boolean_Expression_1 เป็น TRUE ระบบจะข้ามคำสั่ง WHEN…THEN ต่อไป และการดำเนินการ CASE จะสิ้นสุดลงทันที
- ถ้า Boolean_Expression_1 เป็น FALSE ระบบจะประเมิน Boolean_Expression_2 ว่าเป็นจริงหรือไม่ กระบวนการประเมินนิพจน์บูลีนนี้จะดำเนินต่อไปจนกว่านิพจน์บูลีนใดนิพจน์หนึ่งจะส่งคืนค่า TRUE
- หากไม่มีสิ่งใดตรงกัน ระบบจะโอนการควบคุมไปยังคำสั่ง ELSE และจะทำการเรียกใช้ Statement_Else
- เช่นเดียวกับ Simple Case คำสั่ง ELSE ใน Searched Case ก็เป็นตัวเลือกเสริมเช่นกัน
- หากไม่มีคำสั่ง ELSE และไม่มีนิพจน์บูลีนใดส่งค่ากลับเป็น 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
ผลลัพธ์: แผนภาพด้านล่างอธิบายขั้นตอนการทำงานของคำสั่ง SEARCHED CASE โดยไม่มี ELSE
แบบสอบถามที่ 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
ผลลัพธ์: แผนภาพด้านล่างอธิบายลำดับการทำงานของคำสั่ง SEARCHED CASE ที่มี ELSE กำกับอยู่
ความแตกต่างระหว่างวิธีการดำเนินการ: กรณีแบบง่าย (SIMPLE) และกรณีแบบค้นหา (SEARCH)
เรามาดูตัวอย่างกรณีง่ายๆ ด้านล่างนี้กัน:
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
ในที่นี้ 'Tutorial_name' เป็นส่วนหนึ่งของนิพจน์ CASE ใน SQL จากนั้นค่า 'Tutorial_name' จะถูกเปรียบเทียบกับค่า WHEN แต่ละค่า เช่น 'SQL'… จนกว่า 'Tutorial_name' จะตรงกับค่า WHEN ใดค่าหนึ่ง
ในทางตรงกันข้าม ตัวอย่าง SEARCH CASE ไม่มีนิพจน์ 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
ในที่นี้ คำสั่ง WHEN แต่ละคำสั่งจะมีนิพจน์บูลีนแบบมีเงื่อนไขของตัวเอง โดยแต่ละนิพจน์บูลีน เช่น Tutorial_name = 'SQL'… จะถูกประเมินค่าเป็น TRUE/FALSE จนกว่าจะพบนิพจน์บูลีนแรกที่ประเมินค่าได้เป็น TRUE
ความแตกต่างระหว่างกรณีแบบง่ายและกรณีแบบค้นหา
| กรณีที่เรียบง่าย | ค้นหากรณี |
| คำหลัก CASE จะตามด้วย CASE_Expression ทันที และอยู่ก่อนคำสั่ง WHEN
เช่น: |
คำหลัก CASE จะตามด้วยคำสั่ง WHEN และไม่มีนิพจน์ใดๆ อยู่ระหว่าง CASE และ WHEN
เช่น: |
| ในกรณีง่ายๆ จะมีค่า (Value) อยู่ค่าหนึ่งสำหรับคำสั่ง WHEN แต่ละคำสั่ง ค่าเหล่านี้ (Value_1, Value_2…) จะถูกเปรียบเทียบกับนิพจน์ CASE_Expression เดียวตามลำดับ ผลลัพธ์จะถูกประเมินว่าตรงตามเงื่อนไข TRUE/FALSE สำหรับคำสั่ง WHEN แต่ละคำสั่งหรือไม่
เช่น: |
ใน Searched Case จะมี Boolean_Expression สำหรับแต่ละคำสั่ง WHEN โดย Boolean_Expression เหล่านี้ (Boolean_Expression_1, Boolean_Expression_2…) จะประเมินเงื่อนไข TRUE/FALSE สำหรับแต่ละคำสั่ง WHEN
เช่น: |
| กรณีแบบง่าย (Simple Case) รองรับเฉพาะการตรวจสอบความเท่าเทียมกันเท่านั้น กล่าวคือ ตรวจสอบว่า CASE_Expression = VALUE_1 หรือ VALUE_2…
เช่น: |
ด้วย Boolean_Expression_N นั้น Searched Case จะรองรับการดำเนินการใดๆ ก็ตามที่ให้ผลลัพธ์เป็นค่าบูลีน ซึ่งรวมถึงตัวดำเนินการเท่ากับและไม่เท่ากับด้วย
เช่น: |
CASE ที่ซ้อนกัน: CASE ใน IF ELSE
เราสามารถใช้ CASE ภายในคำสั่ง 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 จะทำงานก่อน และหากเงื่อนไข CASE ใน SQL Server เป็นเท็จ คำสั่ง ELSE ก็จะทำงาน ส่วน ELSE นั้นประกอบด้วยคำสั่ง CASE ที่ซ้อนอยู่ภายใน SQL ขึ้นอยู่กับค่าของตั๋วเครื่องบิน ผลลัพธ์อย่างใดอย่างหนึ่งต่อไปนี้จะปรากฏขึ้น:
- ระบบจะแสดงข้อความ 'เยี่ยมชมสถานที่ท่องเที่ยวใกล้เคียง' หากราคาตั๋วเครื่องบินสูงกว่า 400 ดอลลาร์สหรัฐ
- ระบบจะแสดงข้อความ 'เที่ยวลอสแอนเจลิส' หากราคาตั๋วเครื่องบินอยู่ระหว่าง 0 ถึง 100 ดอลลาร์สหรัฐ
- ระบบจะแสดงข้อความ 'เที่ยวนิวยอร์ก' หากราคาตั๋วเครื่องบินอยู่ระหว่าง 101 ถึง 200 ดอลลาร์สหรัฐ
- ระบบจะพิมพ์ข้อความ 'เที่ยวยุโรป' หากราคาตั๋วเครื่องบินอยู่ระหว่าง 201 ถึง 400 ดอลลาร์สหรัฐ
ผลลัพธ์ด้านล่างแสดงตำแหน่งที่ส่งคืนเมื่อคำสั่ง CASE ที่ซ้อนกันทำงานอยู่ภายในส่วน ELSE:
CASE ที่ซ้อนกัน: CASE ภายใน CASE
ใน SQL เราสามารถใช้คำสั่ง CASE ซ้อนกันได้ ตัวอย่างโค้ด 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 ภายในจึงจะทำงาน ตำแหน่งที่ส่งคืนจะอยู่ในช่วงราคาตั๋วเดียวกันกับตัวอย่างก่อนหน้า ดังนั้นตั๋วราคา 250 ดอลลาร์จะอยู่ในช่วง 201-400 ดอลลาร์ และส่งคืน 'Visit Europe'
ผลลัพธ์ด้านล่างแสดงตำแหน่งที่ตั้งที่ได้จากคำสั่ง CASE ภายในสำหรับตั๋วราคา 250 ดอลลาร์:
กรณีที่มีการอัปเดต
สมมติอีกครั้งว่าเรามี 'Guruตารางขนาด 99 ฟุต มีสองคอลัมน์และสี่แถว ดังแสดงในภาพด้านล่าง:
เราสามารถใช้ 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 จะถูกอัปเดตด้วยค่าจากคำสั่ง THEN ขึ้นอยู่กับค่าของ Tutorial_Name:
- ถ้า Tutorial_Name = 'SQL' ให้เปลี่ยน Tutorial_Name เป็น 'Structured Query language'
- ถ้า Tutorial_Name = 'PL/SQL' ให้อัปเดต Tutorial_Name เป็น 'Oracle พีแอล/เอสเค
- ถ้า Tutorial_Name = 'MSSQL' ให้อัปเดต Tutorial_Name เป็น 'Microsoft SQL'
- ถ้า Tutorial_Name = 'Hadoop' ให้ทำการอัปเดต Tutorial_Name เป็น 'Apache Hadoop'
การเรียกใช้คำสั่งจะอัปเดตแถวที่ตรงกัน ดังที่แสดงด้านล่าง:
เรามาสอบถาม 'Guruตาราง 99 เพื่อตรวจสอบค่าที่อัปเดตแล้ว:
กรณีที่มีการสั่งซื้อโดย
เราสามารถใช้คำสั่ง 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 และเนื่องจากนิพจน์บูลีน WHEN ตัวแรกประเมินค่าเป็น TRUE จึงเลือก Tutorial_ID สำหรับเงื่อนไข ORDER BY ผลลัพธ์แสดงอยู่ด้านล่าง:
ข้อเท็จจริงที่น่าสนใจ!
- คำสั่ง CASE สามารถซ้อนอยู่ในคำสั่ง CASE อื่นได้ เช่นเดียวกับการใช้คำสั่ง IF…ELSE
- นอกจากคำสั่ง SELECT แล้ว คำสั่ง CASE ยังสามารถใช้ร่วมกับคำสั่ง SQL อื่นๆ เช่น UPDATE และ ORDER BY ได้อีกด้วย













