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

Chuyển đổi giá trị 1 thành 'Y' trong MySQL SELECT dùng IF()

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 = 1 là 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àmCú phápDù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 ENDLinh hoạtNhiề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ới IF ... THEN ... END IF trong 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() trong WHERE để lọc (dùng CASE hoặc logic AND/OR)

Best Practice

  • Dùng IF() cho chuyển đổi đơn giản 2 giá trị trong SELECT
  • Dùng CASE cho 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)