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

Cập nhật cột dựa trên giá trị CASE trong MySQL

Vấn đề: UPDATE cột với giá trị mới phụ thuộc vào giá trị cũ (đổi chỗ)

Cần hoán đổi giá trị: Marks = 45 → 98, Marks = 98 → 0.

Giải pháp: UPDATE với CASE trong mệnh đề SET

Biểu thức CASE trong SET cho phép gán giá trị khác nhau tùy theo giá trị hiện tại.

1. Tạo bảng và dữ liệu

CREATE TABLE DemoTable (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName VARCHAR(20),
    StudentMarks INT
);

INSERT INTO DemoTable (StudentName, StudentMarks) VALUES
('Chris', 98), ('David', 45);

2. Cập nhật với CASE

UPDATE DemoTable 
SET StudentMarks = CASE StudentMarks
    WHEN 45 THEN 98
    WHEN 98 THEN 0
END
WHERE StudentMarks IN (45, 98);

3. Kết quả (đã hoán đổi)

+-----------+-------------+--------------+
| StudentId | StudentName | StudentMarks |
+-----------+-------------+--------------+
|         1 | Chris       |            0 |
|         2 | David       |           98 |
+-----------+-------------+--------------+

Giải thích

  • CASE StudentMarks WHEN 45 THEN 98 WHEN 98 THEN 0 END – Dạng "simple CASE": so sánh StudentMarks với các giá trị liệt kê.
  • WHERE StudentMarks IN (45, 98) – Giới hạn chỉ cập nhật các hàng liên quan, tránh quét toàn bảng.
  • Nếu không khớp điều kiện CASE nào, giá trị giữ nguyên (hoặc NULL nếu không có ELSE).

Cảnh báo: Không dùng SET col = CASE ... cho hoán đổi trực tiếp hai cột

Sai: UPDATE t SET a = b, b = a; (cả hai dùng giá trị cũ).
Đúng: UPDATE t SET a = b, b = a WHERE ... MySQL đánh giá vế phải trước, sau đó gán – nên a nhận giá trị cũ của b, b nhận giá trị cũ của a? Thực tế MySQL đánh giá từng biểu thức theo thứ tự? Không đảm bảo. An toàn nhất dùng biến tạm hoặc CASE như trên.