ฟังก์ชัน CASE ใน MySQL คือเครื่องมือสำหรับเขียน เงื่อนไขแบบเลือกหลายกรณี (conditional logic) ภายในคำสั่ง SQL โดยจะ ตรวจสอบค่าแต่ละเงื่อนไขที่กำหนดไว้ และคืนค่าผลลัพธ์แรกที่ตรงกัน หากไม่มีเงื่อนไขไหนตรง จะคืนค่าจาก ELSE (ถ้ามี)
ทำหน้าที่คล้าย IF-ELSE หรือ SWITCH ในภาษาโปรแกรมทั่วไป เหมาะสำหรับแปลงค่าหรือแสดงผลลัพธ์ที่แตกต่างกันตามเงื่อนไขใน SELECT, UPDATE, หรือ ORDER BY
ประโยชน์ของฟังก์ชัน CASE
- ใช้แทน
IF-ELSEแบบหลายเงื่อนไขภายในคำสั่ง SQL - สร้างคอลัมน์ใหม่แบบกำหนดค่าตามเงื่อนไขโดยไม่ต้องแก้ไขข้อมูลจริง
- ใช้จัดกลุ่มข้อความ, แสดงสถานะ, หรือแปลงค่าตัวเลขให้อ่านง่าย
- ใช้กับ
ORDER BYเพื่อกำหนดลำดับพิเศษ - ใช้กับ
UPDATEเพื่อปรับข้อมูลแบบหลายเงื่อนไขในคำสั่งเดียว
รูปแบบการใช้งาน
แบบที่ 1: CASE value WHEN ... THEN ... ELSE ... END
CASE value
WHEN compare_value1 THEN result1
WHEN compare_value2 THEN result2
...
ELSE default_result
END
แบบที่ 2: CASE WHEN condition THEN ... ELSE ... END
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
ตัวอย่างการใช้งาน
SQL
SELECT name,
CASE gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
ELSE 'Unknown'
END AS gender_label
FROM employees;หรือ
SQL
SELECT score,
CASE
WHEN score >= 80 THEN 'A'
WHEN score >= 70 THEN 'B'
WHEN score >= 60 THEN 'C'
ELSE 'F'
END AS grade
FROM test_scores;ตัวอย่างการประยุกต์ใช้งานกับข้อมูลจริง
สมมุติว่ามีตารางชื่อ orders ซึ่งมีข้อมูลดังนี้
| order_id | status | amount |
|---|---|---|
| 1 | pending | 1200.00 |
| 2 | paid | 2300.00 |
| 3 | shipped | 1800.00 |
| 4 | cancelled | 500.00 |
| 5 | paid | 3200.00 |
ใช้ CASE แสดงสถานะแบบอ่านง่าย
SQL
SELECT order_id, status, amount,
CASE status
WHEN 'pending' THEN 'รอดำเนินการ'
WHEN 'paid' THEN 'ชำระแล้ว'
WHEN 'shipped' THEN 'จัดส่งแล้ว'
WHEN 'cancelled' THEN 'ยกเลิก'
ELSE 'ไม่ทราบสถานะ'
END AS status_label
FROM orders;ข้อควรระวังในการใช้งาน
CASEจะคืนค่าแรกที่ตรงเงื่อนไขทันที โดยไม่ตรวจเงื่อนไขถัดไป- ต้อง ปิดท้ายด้วย
ENDเสมอ มิฉะนั้นจะเกิด syntax error - ผลลัพธ์ของ
CASEทั้งหมดควรเป็นชนิดข้อมูลเดียวกัน หรือที่แปลงเข้าหากันได้ เช่น ทั้งหมดเป็นข้อความ หรือจำนวน - หากไม่มีเงื่อนไขใดตรงและไม่ใส่
ELSEผลลัพธ์จะเป็นNULL