Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Thay thế giá trị trong bảng MySQL dùng CASE WHEN

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