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 NULLIF(..., 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
ProductIdtă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_keyINT, trigger cập nhật, index trên cột đó