Hàm IF() trong MySQL cho phép chuyển đổi giá trị có điều kiện nhanh gọn trong câu lệnh SELECT. Cú pháp: IF(dieu_kien, gia_tri_khi_true, gia_tri_khi_false).
Cú pháp
SELECT IF(ten_cot = 1, 'Y', ten_cot) AS ten_moi FROM ten_bang;
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE changeValuefrom1toY (
Id INT NOT NULL AUTO_INCREMENT,
isValidAddress TINYINT(1),
PRIMARY KEY(Id)
);
2. Chèn dữ liệu
INSERT INTO changeValuefrom1toY(isValidAddress) VALUES
(1), (0), (1), (1), (1), (0), (1);
3. Xem dữ liệu gốc
SELECT * FROM changeValuefrom1toY;
Kết quả: 7 hàng, cột isValidAddress chứa 1 hoặc 0.
4. Truy vấn IF: 1 → 'Y', 0 → giữ 0
SELECT IF(isValidAddress = 1, 'Y', isValidAddress) AS Answer
FROM changeValuefrom1toY;
Kết quả:
+--------+
| Answer |
+--------+
| Y |
| 0 |
| Y |
| Y |
| Y |
| 0 |
| Y |
+--------+
Giải thích
isValidAddress = 1→ TRUE → trả về'Y'isValidAddress = 0→ FALSE → trả vềisValidAddress(giá trị 0)- Nếu cột là NULL:
NULL = 1là UNKNOWN → nhánh FALSE → trả về NULL
Các biến thể hữu ích
1. Chuyển 1→'Y', 0→'N', NULL→'?'
SELECT IF(isValidAddress = 1, 'Y',
IF(isValidAddress = 0, 'N', '?')) AS Answer
FROM changeValuefrom1toY;
2. Chuyển boolean thành Yes/No
SELECT IF(isValidAddress, 'Yes', 'No') AS Answer
FROM changeValuefrom1toY;
-- Lưu ý: IF(0) = FALSE, IF(1) = TRUE, IF(NULL) = FALSE
3. Kết hợp với COALESCE xử lý NULL
SELECT IF(COALESCE(isValidAddress, 0) = 1, 'Y', 'N') AS Answer
FROM changeValuefrom1toY;
IF() vs CASE WHEN vs IFNULL()
| Hàm | Cú pháp | Dùng cho |
|---|---|---|
IF(cond, t, f) | 3 đối số | Điều kiện TRUE/FALSE đơn giản |
CASE WHEN cond THEN t ELSE f END | Linh hoạt | Nhiều điều kiện, chuẩn ANSI |
IFNULL(expr, val) | 2 đối số | Thay thế NULL (không phải điều kiện logic) |
NULLIF(expr1, expr2) | 2 đối số | Trả về NULL nếu 2 giá trị bằng nhau |
⚠️ Lưu ý quan trọng
IF()là **hàm**, không phải câu lệnh điều khiển (khác vớiIF ... THEN ... END IFtrong stored procedure)- MySQL đánh giá **cả 2 nhánh** trước khi chọn (khác short-circuit) → Cẩn thận với hàm có side-effect
- Kiểu trả về: MySQL tự suy luận từ nhánh TRUE và FALSE (ưu tiên chuỗi > số > ngày)
- Không dùng
IF()trongWHEREđể lọc (dùngCASEhoặc logic AND/OR)
Best Practice
- Dùng
IF()cho chuyển đổi đơn giản 2 giá trị trong SELECT - Dùng
CASEcho logic phức tạp, nhiều nhánh, hoặc cần portable - Luôn test case NULL:
SELECT IF(NULL, 'Y', 'N')→ 'N' (NULL = FALSE)