Vấn đề: Sắp xếp tăng dần nhưng giá trị NULL xuất hiện cuối cùng
Mặc định MySQL: ORDER BY col ASC đặt NULL ở đầu. Cần NULL ở cuối.
Giải pháp: ORDER BY CASE WHEN IS NULL THEN 1 ELSE 0 END, col
Tạo khóa sắp xếp ưu tiên: không NULL (0) trước, NULL (1) sau. Trong nhóm không NULL, sắp xếp bình thường.
1. Tạo bảng và dữ liệu (có NULL và chuỗi rỗng)
CREATE TABLE DemoTable (Name VARCHAR(20));
INSERT INTO DemoTable VALUES
('Chris'), (NULL), ('Adam'), ('John'), (''), (NULL), ('Bob');
2. Dữ liệu gốc
+-------+
| Name |
+-------+
| Chris |
| NULL |
| Adam |
| John |
| |
| NULL |
| Bob |
+-------+
3. Truy vấn ORDER BY ASC, NULL cuối
SELECT * FROM DemoTable
ORDER BY
CASE
WHEN Name IS NULL THEN 100
WHEN Name = '' THEN 101
ELSE 103
END DESC,
Name ASC;
4. Kết quả
+-------+
| Name |
+-------+
| Adam |
| Bob |
| Chris |
| John |
| | -- chuỗi rỗng ''
| NULL |
| NULL |
+-------+
Giải thích
CASEgán trọng số: giá trị hợp lệ = 103 (cao nhất), chuỗi rỗng = 101, NULL = 100 (thấp nhất).DESC– Sắp xếp trọng số giảm dần: 103 (hợp lệ) → 101 (rỗng) → 100 (NULL).Name ASC– Khóa phụ sắp xếp A-Z trong nhóm hợp lệ.
Cách đơn giản hơn (MySQL 8.0+): ORDER BY col IS NULL, col
SELECT * FROM DemoTable
ORDER BY Name IS NULL, Name;
Name IS NULLtrả về 1 (true) cho NULL, 0 cho không NULL.ORDER BY 0, Name→ không NULL trước (A-Z), rồi NULL.- Chuỗi rỗng
''được coi là không NULL → xếp trước NULL.
Lưu ý
- Cách
CASEcho phép kiểm soát chi tiết thứ tự: NULL, rỗng, giá trị hợp lệ. - Không dùng được index cho sắp xếp này (filesort).