เมื่อทำงานกับฐานข้อมูล คุณอาจต้องการรันการดำเนินการ if/then ในคิวรี่ เช่น ต้องการเปลี่ยนสถานะลูกจ้างของพนักงานที่ทำงานเกิน 1 ปี หรือทำเครื่องหมายผู้เล่นในลีดเดอร์บอร์ดว่าเป็นผู้ชนะหากอันดับอยู่ใน 3 อันดับแรก
ใน SQL ทำได้ด้วยคำสั่ง CASE ซึ่งช่วยรันตรรกะ if/then คล้ายกับการใช้ IF ใน Microsoft Excel
ในคู่มือนี้ เราจะแยกวิเคราะห์พื้นฐานของ SQL CASE วิธีใช้งาน การใช้หลายเงื่อนไข และการใช้ร่วมกับฟังก์ชันรวม (aggregate functions)
บทนำสั้นๆ เกี่ยวกับคิวรี่
เพื่อดึงข้อมูลจากฐานข้อมูล ต้องเขียนคิวรี่ คิวรี่เกือบทุกครั้งเริ่มด้วย SELECT ระบุคอลัมน์ที่ต้องการ และ clause FROM ระบุตาราง ไวยากรณ์:
SELECT column_name FROM table_name WHERE conditions_are_met;
ตัวอย่างคิวรี่ดึงชื่อพนักงานทั้งหมดจากตาราง employees:
SELECT name FROM employees;
ผลลัพธ์:
| name |
| Luke Mike Hannah Geoff Alexis Emma Jonah Adam |
(8 แถว)
หากต้องการหลายคอลัมน์ ให้คั่นด้วยจุลภาค หรือใช้ * สำหรับทุกคอลัมน์ นอกจากนี้ยังมี clause WHERE สำหรับกรองเงื่อนไขเฉพาะ เช่น หาพนักงานสาขา Albany:
SELECT name FROM employees WHERE branch = 'Albany';
ผลลัพธ์:
| name |
| Emma Jonah |
(2 แถว)
แต่ถ้าต้องการทำ if/then ขณะรันคิวรี่? นี่คือที่มาของ SQL CASE
SQL CASE
คำสั่ง CASE ใช้กำหนดตรรกะ if/then ใน SQL เช่น ต้องการให้พนักงานที่ทำงานครบ 5 ปีขึ้นไปได้รับเงินเดือนเพิ่ม ไวยากรณ์:
SELECT column1_name CASE WHEN column2_name = 'X' THEN 'Y' ELSE NULL END AS column3_name FROM table_name;
ตัวอย่าง: ให้เงินเพิ่ม $200 แก่พนักงานที่ได้รางวัล "พนักงานเดือน" มากกว่า 5 ครั้ง
SELECT name, CASE WHEN employee_month_awards > 5 THEN 200 ELSE NULL END AS pending_raise FROM employees;
ผลลัพธ์:
| name | pending_raise |
| Luke | |
| Mike | |
| Hannah | |
| Geoff | |
| Alexis | |
| Emma | 200 |
| Jonah | |
| Adam | 200 |
(8 แถว)
การทำงาน: CASE ตรวจสอบแต่ละเรคอร์ด ว่าเงื่อนไข employee_month_awards > 5 จริงหรือไม่ ถ้าจริง แสดงค่า 200 ในคอลัมน์ pending_raise ถ้าเท็จ แสดง NULL
สำคัญ: CASE ไม่ได้เพิ่มคอลัมน์ใหม่ในตาราง แต่สร้างคอลัมน์ใน ผลลัพธ์ของ SELECT เพื่อให้เห็นว่าใครมีสิทธิ์ได้เงินเพิ่ม
หากต้องการให้คนที่ไม่ผ่านเงื่อนไขได้ค่า 0 แทน NULL ให้เปลี่ยน ELSE เป็น 0 สามารถใช้ ORDER BY จัดลำดับผลลัพธ์ได้อีกด้วย
SQL CASE และเงื่อนไขหลายอย่าง (Multiple Conditions)
CASE ใช้ได้หลายครั้งในคิวรี่เดียวกัน เช่น ให้เงินเพิ่ม $50 แก่คนที่ได้รางวัล 3 ครั้งขึ้นไป และ $200 แก่คนที่ได้ 5 ครั้งขึ้นไป:
SELECT name, CASE WHEN employee_month_awards > 5 THEN 200 WHEN employee_month_awards > 3 THEN 50 ELSE 0 END AS pending_raise FROM employees;
ผลลัพธ์:
| name | pending_raise |
| Luke | 50 |
| Mike | |
| Hannah | |
| Geoff | |
| Alexis | |
| Emma | 200 |
| Jonah | 50 |
| Adam | 200 |
(8 แถว)
CASE จะประเมินตามลำดับที่เขียน: ตรวจสอบ >5 ก่อน (ให้ 200) แล้วค่อย >3 (ให้ 50) สุดท้ายค่าเริ่มต้น 0
แต่เขียนแบบนี้อาจพลาดได้หากลำดับผิด ควรเขียนเงื่อนไขที่ไม่ทับซ้อนกัน โดยใช้ AND:
SELECT name, CASE WHEN employee_month_awards >= 3 AND employee_month_awards <= 5 THEN 50 WHEN employee_month_awards > 5 THEN 200 ELSE 0 END AS pending_raise FROM employees;
คิวรี่นี้ให้ผลลัพธ์เหมือนกันแต่ไม่ขึ้นกับลำดับ CASE จึงปลอดภัยกว่า
SQL CASE และฟังก์ชันรวม (Aggregate Functions)
สามารถใช้ CASE ร่วมกับ aggregate function ได้ หากต้องการนับเฉพาะแถวที่ตรงเงื่อนไข เช่น นับว่ามีพนักงานกี่คนที่ได้โบนัส $200:
ไวยากรณ์:
SELECT column1_name CASE WHEN column2_name = 'X' THEN 'Y' ELSE NULL END AS column3_name, COUNT(1) AS count FROM table_name GROUP BY column3_name;
ตัวอย่าง: นับจำนวนพนักงานที่ได้โบนัส $50 ขึ้นไป
SELECT CASE WHEN employee_month_awards >= 3 AND employee_month_awards <= 5 THEN 50 WHEN employee_month_awards > 5 THEN 200 ELSE 0 END AS pending_raise, COUNT(1) AS count FROM employees GROUP BY pending_raise;
ผลลัพธ์:
| pending_raise | count |
| 50 | 3 |
| 3 | |
| 200 | 2 |
ผลลัพธ์แสดง: 3 คนได้ $50, 3 คนไม่ได้โบนัส, 2 คนได้ $200
สรุป
ในบทช่วยสอนนี้ เราแยกวิเคราะห์พื้นฐานของคำสั่ง SQL CASE และการใช้งานเพื่อทำตรรกะ if/then ในคิวรี่ รวมถึงการใช้หลายเงื่อนไขและร่วมกับ aggregate functions
ข้อจำของ simple CASE expression:
- CASE ต้องอยู่ใน clause
SELECT - ต้องมีส่วนประกอบ
WHEN,THEN, และEND - สามารถมีหลาย
WHENและELSEได้ (optional) - สามารถใช้ตัวดำเนินการเงื่อนไข
ANDหรือORระหว่างWHENและTHENได้
ตอนนี้คุณพร้อมใช้ CASE statements แบบมืออาชีพแล้ว!