Sắp xếp tự nhiên (Natural Sort) cho mã alphanumeric trong MySQL
Vấn đề: Sắp xếp chuỗi '101J', '100A', '100B' theo chữ cái cho '100A', '100B', '101J', '101S', '103M' (đúng số nhưng sai chữ).
Tạo bảng và dữ liệu
mysql> create table DemoTable ( StudentCode varchar(20) );
mysql> insert into DemoTable values('101J'), ('100A'), ('100B'), ('101S'), ('103M');
Truy vấn: Sắp xếp phần số trước, rồi phần chữ
mysql> select * from DemoTable order by StudentCode+0, StudentCode;
Kết quả
+-------------+ | StudentCode | +-------------+ | 100A | | 100B | | 101J | | 101S | | 103M | +-------------+
Giải thích kỹ thuật:
StudentCode+0: MySQL tự động ép chuỗi thành số (lấy phần đầu là số). '100A'+0 = 100, '101J'+0 = 101- Sắp xếp đầu tiên theo giá trị số (100, 101, 103)
- Sắp xếp thứ hai theo chuỗi gốc ('100A' trước '100B', '101J' trước '101S')
- 5 warnings: Do chuyển đổi chuỗi không phải số thuần túy thành số
Cách chuẩn hơn (tránh warning):
ORDER BY CAST(StudentCode AS UNSIGNED), StudentCode
Phức tạp hơn (số phần tử không cố định): Cần dùng REGEXP tách số/chữ hoặc hàm tự định nghĩa. MySQL 8.0 có REGEXP_SUBSTR hỗ trợ tốt hơn.