สถานการณ์ปัญหา
เมื่อต้องการอัปเดตราคาสินค้าหลายรายการพร้อมกัน โดยแต่ละรายการมีอัตราเพิ่มที่แตกต่างกัน สามารถใช้คำสั่ง UPDATE ร่วมกับ CASE WHEN เพื่อทำได้ใน Query เดียว
ตัวอย่างการใช้งาน
1. สร้างตารางสินค้า
mysql> CREATE TABLE DemoTable (
-> ProductName VARCHAR(20),
-> ProductPrice INT
-> );
Query OK, 0 rows affected (0.51 sec)
2. เพิ่มข้อมูลสินค้า
mysql> INSERT INTO DemoTable VALUES('Product-1', 700);
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable VALUES('Product-2', 1000);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable VALUES('Product-3', 3000);
Query OK, 1 row affected (0.10 sec)
3. แสดงข้อมูลก่อนอัปเดต
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+-------------+--------------+ | ProductName | ProductPrice | +-------------+--------------+ | Product-1 | 700 | | Product-2 | 1000 | | Product-3 | 3000 | +-------------+--------------+ 3 rows in set (0.00 sec)
4. อัปเดตราคาด้วย CASE WHEN (เพิ่ม % ต่างกัน)
mysql> UPDATE DemoTable
-> SET ProductPrice =
-> CASE
-> WHEN ProductName = 'Product-1' THEN ProductPrice + ((ProductPrice * 20) / 100)
-> WHEN ProductName = 'Product-2' THEN ProductPrice + ((ProductPrice * 40) / 100)
-> WHEN ProductName = 'Product-3' THEN ProductPrice + ((ProductPrice * 60) / 100)
-> END;
Query OK, 3 rows affected (0.14 sec)
Rows matched: 3 Changed: 3 Warnings: 0
5. ตรวจสอบผลลัพธ์หลังอัปเดต
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+-------------+--------------+ | ProductName | ProductPrice | +-------------+--------------+ | Product-1 | 840 | (700 + 20% = 840) | Product-2 | 1400 | (1000 + 40% = 1400) | Product-3 | 4800 | (3000 + 60% = 4800) +-------------+--------------+ 3 rows in set (0.00 sec)
ข้อดีของวิธีนี้
- ทำได้ใน Query เดียว (Single statement) ลด Round-trip ไป Database
- Atomic operation - สำเร็จทั้งหมดหรือล้มเหลวทั้งหมด
- ประสิทธิภาพดีกว่า Loop UPDATE หลายครั้ง
- โค้ดอ่านง่าย บำรุงรักษาง่าย
รูปแบบทั่วไป
UPDATE table_name
SET column_name = CASE
WHEN condition1 THEN expression1
WHEN condition2 THEN expression2
...
ELSE column_name -- ค่าเดิมหากไม่ตรงเงื่อนไขใดๆ
END
WHERE condition; -- อาจเพิ่ม WHERE เพื่อจำกัดขอบเขต
ข้อควรระวัง
- หากไม่มี ELSE และไม่มีเงื่อนไขตรง จะตั้งค่าเป็น NULL
- ควรมี WHERE clause เพื่อไม่ให้อัปเดตแถวที่ไม่ต้องการ
- ทดสอบด้วย SELECT ก่อน UPDATE จริง