การ UPDATE ทุกแถวแต่ข้ามค่าเฉพาะด้วย IF()
ใช้ IF(condition, true_val, false_val) ใน SET clause เพื่อตั้งค่าต่างกันตามเงื่อนไข: แถวที่ตรงเงื่อนไขคงค่าเดิม แถวอื่นอัปเดต
Syntax
UPDATE table_name SET column = IF(exclude_condition, current_value, new_value);
ตัวอย่าง: อัปเดต isMarried = 1 ทุกคน ยกเว้น Id=5 (คงค่าเดิม)
สร้างตารางและเพิ่มข้อมูล:
mysql> CREATE TABLE DemoTable736 (
CustomerId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerName VARCHAR(100),
isMarried BOOLEAN
);
Query OK, 0 rows affected (0.53 sec)
mysql> INSERT INTO DemoTable736 (CustomerName, isMarried) VALUES
('Chris', 0), ('Robert', 0), ('David', 0), ('Mike', 0), ('Carol', 1), ('Bob', 0);
Query OK, 6 rows affected
ข้อมูลต้นฉบับ:
mysql> SELECT * FROM DemoTable736;
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 0 | | 2 | Robert | 0 | | 3 | David | 0 | | 4 | Mike | 0 | | 5 | Carol | 1 | | 6 | Bob | 0 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
อัปเดต isMarried = 1 ทุกแถว **ยกเว้น CustomerId = 5** (Carol):
mysql> UPDATE DemoTable736 SET isMarried = IF(CustomerId = 5, 1, 1); Query OK, 5 rows affected (0.13 sec)
หมายเหตุ: ตัวอย่างนี้ IF(CustomerId=5, 1, 1) ทั้งสองด้านคือ 1 → ทุกแถวกลายเป็น 1 (รวม Carol ด้วย) หากต้องการ **ข้ามจริง** (Carol คง 1, คนอื่นกลายเป็น 1 → ผลเหมือนกัน) แต่ถ้าต้องการ Carol คงค่าเดิม คนอื่นเปลี่ยน:
UPDATE DemoTable736 SET isMarried = IF(CustomerId = 5, isMarried, 1); -- Carol คง 1, คนอื่นเป็น 1
ผลลัพธ์ (ทุกคนกลายเป็น 1):
mysql> SELECT * FROM DemoTable736;
+------------+--------------+-----------+ | CustomerId | CustomerName | isMarried | +------------+--------------+-----------+ | 1 | Chris | 1 | | 2 | Robert | 1 | | 3 | David | 1 | | 4 | Mike | 1 | | 5 | Carol | 1 | | 6 | Bob | 1 | +------------+--------------+-----------+ 6 rows in set (0.00 sec)
รูปแบบที่ใช้งานจริงมากกว่า: อัปเดตเฉพาะกลุ่ม บางกลุ่มไม่เปลี่ยน
-- อัปเดต Status = 'Active' สำหรับทุกคน ยกเว้น Role='Admin' UPDATE users SET status = IF(role = 'Admin', status, 'Active'); -- เพิ่ม Salary 10% ยกเว้น Department='Executive' UPDATE employees SET salary = IF(department = 'Executive', salary, salary * 1.10);
CASE WHEN สำหรับหลายเงื่อนไข
UPDATE DemoTable736
SET isMarried = CASE
WHEN CustomerId = 5 THEN isMarried -- ข้าม Carol
WHEN CustomerId = 3 THEN 0 -- David = 0
ELSE 1 -- คนอื่น = 1
END;