Cú pháp IF trong UPDATE
Sử dụng hàm IF(condition, true_value, false_value) trong mệnh đề SET:
UPDATE ten_bang
SET cot1 = IF(dieu_kien, gia_tri_true, gia_tri_false),
cot2 = IF(dieu_kien_khac, gia_tri_true, gia_tri_false)
WHERE dieu_kien_loc;
Ví dụ: Cập nhật BookName và BookId có điều kiện
1. Tạo bảng
mysql> CREATE TABLE UpdateWithIfCondition ( -> BookId INT, -> BookName VARCHAR(200) -> ); Query OK, 0 rows affected (0.60 sec)
2. Chèn dữ liệu
mysql> INSERT INTO UpdateWithIfCondition VALUES(1000,'C in Depth'); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO UpdateWithIfCondition VALUES(1001,'Introduction to Java'); Query OK, 1 row affected (0.14 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM UpdateWithIfCondition;
+--------+----------------------+ | BookId | BookName | +--------+----------------------+ | 1000 | C in Depth | | 1001 | Introduction to Java | +--------+----------------------+ 2 rows in set (0.00 sec)
4. UPDATE với IF (cập nhật 2 cột cùng lúc)
mysql> UPDATE UpdateWithIfCondition -> SET BookName = IF(BookName = 'C in Depth', 'Introduction to C', BookName), -> BookId = IF(BookId = 1001, 2000, BookId); Query OK, 2 rows affected (0.43 sec) Rows matched: 2 Changed: 2 Warnings: 0
5. Kết quả
mysql> SELECT * FROM UpdateWithIfCondition;
+--------+----------------------+ | BookId | BookName | +--------+----------------------+ | 1000 | Introduction to C | | 2000 | Introduction to Java | +--------+----------------------+ 2 rows in set (0.00 sec)
CASE WHEN - Mạnh mẽ hơn IF
Hỗ trợ nhiều điều kiện, chuẩn ANSI SQL:
UPDATE ten_bang
SET ten_cot = CASE
WHEN dieu_kien_1 THEN gia_tri_1
WHEN dieu_kien_2 THEN gia_tri_2
WHEN dieu_kien_3 THEN gia_tri_3
ELSE gia_tri_mac_dinh
END;
Ví dụ CASE WHEN
UPDATE products
SET price_category = CASE
WHEN price < 100 THEN 'Rẻ'
WHEN price < 500 THEN 'Trung bình'
WHEN price < 1000 THEN 'Đắt'
ELSE 'Sang trọng'
END;
So sánh IF vs CASE
| Đặc điểm | IF() | CASE WHEN |
|---|---|---|
| Số điều kiện | 1 (true/false) | Nhiều (WHEN...WHEN...ELSE) |
| Độ phức tạp | Đơn giản | Phức tạp |
| Chuẩn SQL | MySQL extension | ANSI SQL |
| Đọc/ghi | Ngắn gọn | Rõ ràng, dễ bảo trì |
| Lồng nhau | Khó đọc | Dễ lồng (CASE trong CASE) |
Lưu ý
- IF() là hàm, CASE là biểu thức
- IFNULL() ≠ IF() - IFNULL chỉ 2 tham số, kiểm tra NULL
- WHERE clause vẫn cần để giới hạn hàng bị ảnh hưởng
- Test trước với SELECT để kiểm tra logic
Test logic trước khi UPDATE
SELECT
BookId, BookName,
IF(BookName = 'C in Depth', 'Introduction to C', BookName) AS new_name,
IF(BookId = 1001, 2000, BookId) AS new_id
FROM UpdateWithIfCondition;