Mục tiêu
Sắp xếp dữ liệu hỗn hợp (chữ và số) theo quy tắc tùy chỉnh: chữ cái trước, sau đó là số, mỗi nhóm sắp xếp theo thứ tự tự nhiên.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Value VARCHAR(20)
);
mysql> INSERT INTO DemoTable(Value) VALUES('101');
mysql> INSERT INTO DemoTable(Value) VALUES('P');
mysql> INSERT INTO DemoTable(Value) VALUES('A');
mysql> INSERT INTO DemoTable(Value) VALUES('53');
mysql> INSERT INTO DemoTable(Value) VALUES('R');
mysql> INSERT INTO DemoTable(Value) VALUES('C');
mysql> INSERT INTO DemoTable(Value) VALUES('190');
Dữ liệu gốc
+----+-------+ | Id | Value | +----+-------+ | 1 | 101 | | 2 | P | | 3 | A | | 4 | 53 | | 5 | R | | 6 | C | | 7 | 190 | +----+-------+
Truy vấn sắp xếp tùy chỉnh
mysql> SELECT Id, Value FROM DemoTable
-> ORDER BY CASE
WHEN Value REGEXP '[a-zA-Z]' THEN 0
ELSE 0 + Value
END ASC, Value;
Kết quả
+----+-------+ | Id | Value | +----+-------+ | 3 | A | | 6 | C | | 2 | P | | 5 | R | | 4 | 53 | | 1 | 101 | | 7 | 190 | +----+-------+
Giải thích cơ chế
CASE WHEN Value REGEXP '[a-zA-Z]' THEN 0 ELSE 0+Value END:- Nếu là chữ cái → trả về 0 (ưu tiên cao nhất)
- Nếu là số → chuyển thành số thực (0+Value ép kiểu)
ORDER BY ... ASC, Value: Sắp xếp theo kết quả CASE trước, sau đó theo Value gốc
Mở rộng: Sắp xếp số trước, chữ sau
ORDER BY CASE
WHEN Value REGEXP '^[0-9]+$' THEN 0
ELSE 1
END ASC,
CASE
WHEN Value REGEXP '^[0-9]+$' THEN CAST(Value AS UNSIGNED)
ELSE Value
END ASC;
Lưu ý về REGEXP
REGEXP '[a-zA-Z]': Kiểm tra có chứa chữ cáiREGEXP '^[0-9]+$': Kiểm tra toàn bộ là số- MySQL 8.0+ hỗ trợ
REGEXP_LIKE()chuẩn SQL