Sắp xếp chuỗi kiểu A1, A10, A2 theo thứ tự chữ cái rồi số tự nhiên: tách phần chữ và phần số, sắp xếp phần chữ theo chữ, phần số theo giá trị số.
Cú pháp
SELECT *
FROM ten_bang
ORDER BY SUBSTR(cot, 1, 1), CAST(SUBSTR(cot, 2) AS UNSIGNED);
Giả định: 1 ký tự chữ cái đầu, phần còn lại là số. Điều chỉnh SUBSTR nếu pattern khác.
Ví dụ minh họa
Tạo bảng OrderByStringWithNumbers:
CREATE TABLE OrderByStringWithNumbers (
Id INT NOT NULL AUTO_INCREMENT,
Words VARCHAR(10), PRIMARY KEY (Id)
);
INSERT INTO OrderByStringWithNumbers (Words) VALUES
('A10'), ('A30'), ('A12'), ('A11'), ('A28'), ('A21');
Sắp xếp mặc định (lexicographic): A10, A11, A12, A21, A28, A30 → sai (A10 < A2).
Sắp xếp tự nhiên
SELECT *
FROM OrderByStringWithNumbers
ORDER BY SUBSTR(Words, 1, 1), CAST(SUBSTR(Words, 2) AS UNSIGNED);
Kết quả đúng:
+----+-------+
| Id | Words |
+----+-------+
| 1 | A10 |
| 4 | A11 |
| 3 | A12 |
| 6 | A21 |
| 5 | A28 |
| 2 | A30 |
+----+-------+
Mở rộng cho pattern phức tạp (MySQL 8.0+):
ORDER BY
CAST(REGEXP_SUBSTR(cot, '^[^0-9]+') AS CHAR), -- phần chữ
CAST(REGEXP_SUBSTR(cot, '[0-9]+$') AS UNSIGNED) -- phần số
Tách tự động phần chữ và số cuối, không cần biết độ dài cố định.