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

เพิ่มราคาสินค้าหลายรายการพร้อมกันด้วย CASE WHEN ใน MySQL


สถานการณ์ปัญหา

เมื่อต้องการอัปเดตราคาสินค้าหลายรายการพร้อมกัน โดยแต่ละรายการมีอัตราเพิ่มที่แตกต่างกัน สามารถใช้คำสั่ง 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 จริง