Để hiển thị giá trị 1 thành 'Y' (Yes) và giữ các giá trị khác (như 0) nguyên vẹn trong kết quả SELECT, bạn dùng câu lệnh CASE WHEN.
Cú pháp
SELECT cot1, cot2,
CASE
WHEN ten_cot = 1 THEN 'Y'
ELSE ten_cot
END 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 (1 và 0)
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ả:
+----+----------------+
| Id | isValidAddress |
+----+----------------+
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
| 6 | 0 |
| 7 | 1 |
+----+----------------+
4. Truy vấn CASE: 1 → 'Y', khác → giữ nguyên
SELECT *,
CASE
WHEN isValidAddress = 1 THEN 'Y'
ELSE isValidAddress
END AS Answer
FROM changeValuefrom1toY;
Kết quả:
+----+----------------+--------+
| Id | isValidAddress | Answer |
+----+----------------+--------+
| 1 | 1 | Y |
| 2 | 0 | 0 |
| 3 | 1 | Y |
| 4 | 1 | Y |
| 5 | 1 | Y |
| 6 | 0 | 0 |
| 7 | 1 | Y |
+----+----------------+--------+
Các biến thể CASE
CASE đơn giản (Simple CASE) - so sánh bằng
SELECT CASE isValidAddress
WHEN 1 THEN 'Y'
WHEN 0 THEN 'N'
ELSE '?'
END AS Answer FROM changeValuefrom1toY;
CASE tìm kiếm (Searched CASE) - điều kiện phức tạp
SELECT CASE
WHEN isValidAddress = 1 THEN 'Yes'
WHEN isValidAddress = 0 THEN 'No'
WHEN isValidAddress IS NULL THEN 'Unknown'
ELSE 'Invalid'
END AS Status FROM bang;
Cách khác: Dùng IF() (ngắn hơn cho 2 nhánh)
SELECT IF(isValidAddress = 1, 'Y', isValidAddress) AS Answer
FROM changeValuefrom1toY;
Kết quả giống hệt CASE ở trên.
Cách khác: Dùng ELT() (cho mapping cố định)
-- ELT(index, val1, val2, ...) trả về val_index
-- isValidAddress = 1 → ELT(2, 'N', 'Y') = 'Y' (index 1-based)
SELECT ELT(isValidAddress + 1, 'N', 'Y') AS Answer FROM changeValuefrom1toY;
So sánh các cách
| Cách | Ưu điểm | Nhược điểm |
|---|---|---|
CASE WHEN | Chuẩn ANSI, đọc dễ, nhiều nhánh, điều kiện phức tạp | Verbose |
IF() | Ngắn gọn, 2 nhánh | Chỉ MySQL, lồng nhau khó đọc |
ELT() | Rất nhanh cho mapping index→value | Chỉ dùng cho index liên tiếp 1,2,3... |
Lưu ý kiểu dữ liệu
- Kết quả CASE/IF/ELT là chuỗi (VARCHAR) do nhánh 'Y' là chuỗi
- Nếu cần kiểu số:
CASE WHEN cot=1 THEN 1 ELSE 0 END - COALESCE kiểu:
COALESCE(NULLIF(cot, 1), cot)- phức tạp, không khuyên dùng