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

Cách sắp xếp MySQL cho giá trị rỗng/NULL về cuối


Cú pháp

Sử dụng IF() trong ORDER BY: giá trị rỗng/NULL trả về 1 (sau), còn lại trả về 0 (trước):

SELECT * FROM ten_bang 
ORDER BY IF(ten_cot = '' OR ten_cot IS NULL, 1, 0), ten_cot;

Ví dụ chi tiết

1. Tạo bảng

mysql> CREATE TABLE emptyCellsAtEnd ( 
-> ProductId VARCHAR(100) 
-> ); 
Query OK, 0 rows affected (0.65 sec)

2. Chèn dữ liệu (có chuỗi rỗng)

mysql> INSERT INTO emptyCellsAtEnd VALUES(''); 
Query OK, 1 row affected (0.23 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-1'); 
Query OK, 1 row affected (0.21 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-2'); 
Query OK, 1 row affected (0.14 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES(''); 
Query OK, 1 row affected (0.15 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-3'); 
Query OK, 1 row affected (0.18 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-4'); 
Query OK, 1 row affected (0.09 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-9'); 
Query OK, 1 row affected (0.11 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES(''); 
Query OK, 1 row affected (0.15 sec) 
mysql> INSERT INTO emptyCellsAtEnd VALUES('P-8'); 
Query OK, 1 row affected (0.17 sec)

3. Dữ liệu gốc

mysql> SELECT * FROM emptyCellsAtEnd;
+-----------+ 
| ProductId | 
+-----------+ 
|           | 
| P-1       | 
| P-2       | 
|           | 
| P-3       | 
| P-4       | 
| P-9       | 
|           | 
| P-8       | 
+-----------+ 
9 rows in set (0.00 sec)

4. Sắp xếp: rỗng/NULL về cuối, A-Z trước

mysql> SELECT * FROM emptyCellsAtEnd 
-> ORDER BY IF(ProductId = '' OR ProductId IS NULL, 1, 0), ProductId;
+-----------+ 
| ProductId | 
+-----------+ 
| P-1       | 
| P-2       | 
| P-3       | 
| P-4       | 
| P-8       | 
| P-9       | 
|           | 
|           | 
|           | 
+-----------+ 
9 rows in set (0.00 sec)

Giải thích

  • ProductId = '' OR ProductId IS NULL: Kiểm tra rỗng HOẶC NULL
  • IF(..., 1, 0): Trả về 1 nếu rỗng/NULL, 0 nếu có giá trị
  • Sắp xếp: 0 (có giá trị) trước, 1 (rỗng/NULL) sau
  • Trong mỗi nhóm, sắp xếp theo ProductId tăng dần

Các biến thể

Chỉ NULL về cuối (chuỗi rỗng bình thường)

ORDER BY (ten_cot IS NULL), ten_cot

NULL lên đầu, rỗng xuống cuối

ORDER BY ten_cot IS NULL DESC, ten_cot = '', ten_cot

Sử dụng CASE WHEN (rõ ràng hơn)

ORDER BY 
    CASE 
        WHEN ten_cot IS NULL THEN 2 
        WHEN ten_cot = '' THEN 1 
        ELSE 0 
    END, 
    ten_cot

MySQL 8.0: NULLS FIRST / NULLS LAST

-- MySQL 8.0.2+ (chỉ cho NULL, không xử lý chuỗi rỗng)
SELECT * FROM ten_bang ORDER BY ten_cot NULLS LAST;

Lưu ý

  • Expression trong ORDER BY không dùng index → filesort
  • Hiệu năng tốt cho bảng < 100k hàng
  • Bảng lớn: Thêm cột sort_key INT, trigger cập nhật, index trên cột đó