Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> SQL

คำสั่ง SQL CASE: ตรรกะ If/Then ในคิวรี่

เมื่อทำงานกับฐานข้อมูล คุณอาจต้องการรันการดำเนินการ 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;

ผลลัพธ์:

namepending_raise
Luke
Mike
Hannah
Geoff
Alexis
Emma200
Jonah
Adam200

(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;

ผลลัพธ์:

namepending_raise
Luke50
Mike
Hannah
Geoff
Alexis
Emma200
Jonah50
Adam200

(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_raisecount
503
3
2002

ผลลัพธ์แสดง: 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 แบบมืออาชีพแล้ว!