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

MySQL: ORDER BY chữ cái trước, số sau (RLIKE/REGEXP)

Mặc định MySQL sắp xếp theo mã ASCII (số 0-9 đứng trước chữ A-Z). Để đảo ngược: chữ cái trước, số sau, dùng IF(cot RLIKE '^[a-z]', 1, 2) trong ORDER BY.

Cú pháp

SELECT * FROM ten_bang 
ORDER BY IF(ten_cot RLIKE '^[a-z]', 1, 2), ten_cot;

RLIKE '^[a-z]' kiểm tra ký tự đầu là chữ cái (a-z, không phân biệt hoa/thường). Trả 1 cho chữ, 2 cho số/khác.

Ví dụ minh họa

Tạo bảng tên混合 chữ và số:

mysql> CREATE TABLE ChuCaiTruocSoSau (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Ten VARCHAR(20)
    -> );

mysql> INSERT INTO ChuCaiTruocSoSau(Ten) VALUES 
    -> ('John'), ('Bob'), ('1Sam'), ('Carol'), ('2Larry'), ('David'), ('3Mike'), ('Robert');

Dữ liệu gốc (theo Id):

+----+--------+
| Id | Ten    |
+----+--------+
| 1  | John   |
| 2  | Bob    |
| 3  | 1Sam   |
| 4  | Carol  |
| 5  | 2Larry |
| 6  | David  |
| 7  | 3Mike  |
| 8  | Robert |
+----+--------+

Sắp xếp: chữ cái trước (A-Z), số sau (0-9)

mysql> SELECT * FROM ChuCaiTruocSoSau 
    -> ORDER BY IF(Ten RLIKE '^[a-z]', 1, 2), Ten;

Kết quả:

+----+--------+
| Id | Ten    |
+----+--------+
| 2  | Bob    |
| 4  | Carol  |
| 6  | David  |
| 1  | John   |
| 8  | Robert |
| 3  | 1Sam   |
| 5  | 2Larry |
| 7  | 3Mike  |
+----+--------+

Giải thích: Các tên bắt đầu bằng chữ (Bob, Carol, David, John, Robert) lên đầu, sắp xếp A-Z. Các tên bắt đầu bằng số (1Sam, 2Larry, 3Mike) xuống cuối, sắp xếp theo số.

Mở rộng: Dùng '^[0-9]' để kiểm tra số, '^[A-Za-z]' cho rõ ràng hơn.