Giới thiệu
Khi cần hoán đổi (swap) hai giá trị 'a' ↔ 'b' trong một cột chỉ chứa 2 giá trị này, cách an toàn và đơn giản nhất là dùng câu lệnh CASE trong UPDATE.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Value CHAR(1)
);
mysql> INSERT INTO DemoTable VALUES
('a'), ('b'), ('a'), ('a'), ('b'), ('a'), ('b');
Xem dữ liệu trước
mysql> SELECT * FROM DemoTable;
+-------+ | Value | +-------+ | a | | b | | a | | a | | b | | a | | b | +-------+
Câu lệnh UPDATE với CASE
mysql> UPDATE DemoTable
SET Value = CASE
WHEN Value = 'a' THEN 'b'
ELSE 'a'
END;
Kết quả sau hoán đổi
mysql> SELECT * FROM DemoTable;
+-------+ | Value | +-------+ | b | | a | | b | | b | | a | | b | | a | +-------+
Tại sao dùng CASE thay vì 2 UPDATE riêng?
Nếu chạy 2 câu UPDATE lần lượt:
UPDATE DemoTable SET Value = 'b' WHERE Value = 'a'; -- Tất cả thành 'b' UPDATE DemoTable SET Value = 'a' WHERE Value = 'b'; -- Tất cả thành 'a' (sai!)
Cách này sai vì câu thứ 2 sẽ cập nhật cả các dòng vừa đổi ở câu 1. CASE xử lý đồng thời trong một pass duy nhất.
Mở rộng: Nhiều giá trị hơn
UPDATE DemoTable
SET Value = CASE Value
WHEN 'a' THEN 'b'
WHEN 'b' THEN 'c'
WHEN 'c' THEN 'a'
ELSE Value
END;
Xoay vòng 3 giá trị a→b→c→a.