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

Sắp xếp bản ghi VARCHAR chứa số và chữ trong MySQL

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.