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

MySQL ORDER BY ASC nhưng đẩy NULL xuống cuối

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

  • CASE gá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 NULL trả 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 CASE cho 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).