Kỹ thuật: UPDATE + CASE WHEN
UPDATE bang
SET cot = CASE
WHEN cot = 'gia_tri_1' THEN 'gia_tri_moi_1'
WHEN cot = 'gia_tri_2' THEN 'gia_tri_moi_2'
ELSE cot -- Giữ nguyên các giá trị khác
END
WHERE cot IN ('gia_tri_1', 'gia_tri_2'); -- Tối ưu: chỉ xử lý các dòng cần thiết
Ví dụ: Đảo giá trị YES ↔ NO, giữ nguyên DONOTKNOW
Dữ liệu ban đầu
+----+--------+-----------------+
| Id | Name | isGreaterThan18 |
+----+--------+-----------------+
| 1 | John | YES |
| 2 | Carol | NO |
| 3 | Mike | YES |
| 4 | Bob | YES |
| 5 | Larry | NO |
| 6 | David | NO |
| 7 | James | DONOTKNOW |
| 8 | Robert | DONOTKNOW |
+----+--------+-----------------+
Truy vấn
mysql> UPDATE replaceValueDemo
-> SET isGreaterThan18 = CASE
-> WHEN isGreaterThan18 = 'YES' THEN 'NO'
-> ELSE 'YES'
-> END
-> WHERE isGreaterThan18 IN ('YES', 'NO');
Kết quả
+----+--------+-----------------+
| Id | Name | isGreaterThan18 |
+----+--------+-----------------+
| 1 | John | NO |
| 2 | Carol | YES |
| 3 | Mike | NO |
| 4 | Bob | NO |
| 5 | Larry | YES |
| 6 | David | YES |
| 7 | James | DONOTKNOW |
| 8 | Robert | DONOTKNOW |
+----+--------+-----------------+
Các pattern thường gặp
- Đảo boolean:
CASE WHEN cot=1 THEN 0 ELSE 1 END
- Map nhiều giá trị: Thêm nhiều WHEN
- Chuyển enum/code sang label:
CASE WHEN status=1 THEN 'Active'...
- Normalize dữ liệu: Chuẩn hóa 'Y'/'N'/'Yes'/'No' → 'YES'/'NO'
Lưu ý
- WHERE IN(...) quan trọng để không quét/update toàn bảng
- ELSE cot: Giữ nguyên giá trị không khớp điều kiện
- CASE trả về NULL nếu không có ELSE và không khớp WHEN nào