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

Sắp xếp truy vấn MySQL với ORDER BY CASE WHEN REGEXP?

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ế

  1. 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)
  2. 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ái
  • REGEXP '^[0-9]+$': Kiểm tra toàn bộ là số
  • MySQL 8.0+ hỗ trợ REGEXP_LIKE() chuẩn SQL