Để cập nhật giá trị khác nhau cho một cột tùy thuộc vào điều kiện, MySQL cung cấp hàm IF(condition, value_if_true, value_if_false) hoặc cấu trúc CASE WHEN bên trong mệnh đề SET của câu lệnh UPDATE.
Ví dụ minh họa
Tạo bảng:
mysql> CREATE TABLE DemoTable1436 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(20)
);
Chèn dữ liệu (có 3 hàng tên 'David'):
mysql> INSERT INTO DemoTable1436 (Name) VALUES ('Chris');
mysql> INSERT INTO DemoTable1436 (Name) VALUES ('David');
mysql> INSERT INTO DemoTable1436 (Name) VALUES ('Bob');
mysql> INSERT INTO DemoTable1436 (Name) VALUES ('David');
mysql> INSERT INTO DemoTable1436 (Name) VALUES ('David');
Dữ liệu:
mysql> SELECT * FROM DemoTable1436;
+----+-------+ | Id | Name | +----+-------+ | 1 | Chris | | 2 | David | | 3 | Bob | | 4 | David | | 5 | David | +----+-------+
Cập nhật có điều kiện: Chỉ đổi tên 'David' thành 'Carol Taylor' cho Id=2
mysql> UPDATE DemoTable1436
SET Name = IF(Name = 'David', 'Carol Taylor', Name)
WHERE Id = 2;
Kết quả (chỉ hàng Id=2 thay đổi):
mysql> SELECT * FROM DemoTable1436;
+----+--------------+ | Id | Name | +----+--------------+ | 1 | Chris | | 2 | Carol Taylor | | 3 | Bob | | 4 | David | | 5 | David | +----+--------------+
Giải thích
IF(Name = 'David', 'Carol Taylor', Name): Nếu Name là 'David' thì gán 'Carol Taylor', ngược lại giữ nguyên Name.WHERE Id = 2: Chỉ áp dụng cho hàng Id=2. Nếu bỏ WHERE, tất cả hàng tên David sẽ bị đổi.
Mở rộng: CASE WHEN cho nhiều điều kiện
UPDATE DemoTable1436
SET Name = CASE
WHEN Name = 'David' THEN 'Carol Taylor'
WHEN Name = 'Bob' THEN 'Robert'
WHEN Name = 'Chris' THEN 'Christopher'
ELSE Name
END
WHERE Id IN (1,2,3,4,5);
So sánh IF() vs CASE WHEN
| Đặc điểm | IF() | CASE WHEN |
|---|---|---|
| Số điều kiện | 1 điều kiện (true/false) | Nhiều điều kiện |
| Độ đọc | Đơn giản, ngắn | Rõ ràng cho logic phức tạp |
| Chuẩn SQL | MySQL extension | Chuẩn SQL:2003 |
Mẹo: Dùng CASE khi có từ 2 nhánh điều kiện trở lên. Dùng IF() cho logic nhị phân đơn giản.