Giới thiệu
Khi cần sắp xếp theo thứ tự nghiệp vụ cụ thể (không phải alphabet/number), MySQL cung cấp ORDER BY CASE ... hoặc hàm FIELD().
Ví dụ thực hành
1. Tạo bảng DemoTable808
mysql> CREATE TABLE DemoTable808 (Value VARCHAR(100));
2. Chèn dữ liệu
mysql> INSERT INTO DemoTable808 VALUES ('smith'),('Adamsmith'),('Carolsmith'),('smithJohn');
3. Sắp xếp: chuỗi bắt đầu bằng 'smith' lên đầu, rồi sắp xếp A-Z
mysql> SELECT * FROM DemoTable808
ORDER BY CASE WHEN Value LIKE 'smith%' THEN 0 ELSE 1 END ASC, Value ASC;
4. Kết quả
+------------+
| Value |
+------------+
| smith |
| smithJohn |
| Adamsmith |
| Carolsmith |
+------------+
Cách thay thế: dùng FIELD()
Nếu muốn sắp xếp theo danh sách giá trị cố định:
SELECT * FROM DemoTable808
ORDER BY FIELD(Value, 'smith', 'smithJohn', 'Adamsmith', 'Carolsmith');
Giá trị không có trong danh sách sẽ được xếp cuối (giá trị NULL của FIELD = 0, nhưng ORDER BY ASC đặt 0 trước → cần FIELD(...) DESC hoặc COALESCE(FIELD(...), 999)).
So sánh
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
CASE WHEN | Linh hoạt, điều kiện phức tạp | Dài, chậm hơn chút |
FIELD() | Ngắn, nhanh cho danh sách cố định | Chỉ khớp giá trị chính xác |
Mẹo: Sắp xếp NULL lên cuối
ORDER BY (col IS NULL), col; -- NULL cuối
ORDER BY (col IS NOT NULL) DESC, col; -- NULL đầu