Mục đích
Sắp xếp kết quả theo thứ tự tùy chỉnh không theo alphabet hay numeric, dùng CASE trong mệnh đề ORDER BY.
Ví dụ
Tạo bảng và dữ liệu:
CREATE TABLE DemoTable (StudentId VARCHAR(100));
INSERT INTO DemoTable VALUES
('STU-980'), ('STU-1029'), ('STU-189'), ('STU-890');
Thứ tự mong muốn: STU-890, STU-1029, STU-980, STU-189
Truy vấn:
SELECT * FROM DemoTable
ORDER BY CASE
WHEN StudentId = 'STU-890' THEN 1
WHEN StudentId = 'STU-1029' THEN 2
WHEN StudentId = 'STU-980' THEN 3
WHEN StudentId = 'STU-189' THEN 4
ELSE 5
END;
Kết quả:
+-----------+
| StudentId |
+-----------+
| STU-890 |
| STU-1029 |
| STU-980 |
| STU-189 |
+-----------+
Cách viết gọn hơn với FIELD()
MySQL có hàm FIELD() chuyên dụng cho trường hợp này:
SELECT * FROM DemoTable
ORDER BY FIELD(StudentId, 'STU-890', 'STU-1029', 'STU-980', 'STU-189');
So sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| CASE WHEN | Linh hoạt, xử lý điều kiện phức tạp | Verbose, dễ sai khi nhiều giá trị |
| FIELD() | Ngắn gọn, tối ưu cho danh sách giá trị cố định | Chỉ dùng cho so sánh bằng đơn giản |
| JOIN với bảng mapping | Dễ maintain, tách config khỏi query | Cần bảng phụ, phức tạp hơn |
Lưu ý
- Luôn thêm
ELSEtrong CASE để xử lý giá trị không nằm trong danh sách. - Có thể kết hợp với cột khác:
ORDER BY CASE..., created_at DESC.