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

Sắp xếp số lưu dạng VARCHAR có số 0 dẫn đầu (085, 090) trong MySQL

Để sắp xếp đúng thứ tự số học cho cột VARCHAR chứa số (có thể có số 0 dẫn đầu như '085', '090'), dùng biểu thức column*1 (ép kiểu sang số) trong ORDER BY.

Ví dụ minh họa

Tạo bảng:

mysql> create table DemoTable ( 
    Value varchar(100) 
);

Chèn dữ liệu (có '045', '085', '090' với 0 dẫn đầu):

mysql> insert into DemoTable values('90');
mysql> insert into DemoTable values('86');
mysql> insert into DemoTable values('45');
mysql> insert into DemoTable values('85');
mysql> insert into DemoTable values('085');
mysql> insert into DemoTable values('090');
mysql> insert into DemoTable values('045');

Hiển thị dữ liệu gốc (sắp xếp chuỗi mặc định - sai thứ tự số):

mysql> select * from DemoTable;

Kết quả (string sort):

+-------+
| Value |
+-------+
| 90    |
| 86    |
| 45    |
| 85    |
| 085   |
| 090   |
| 045   |
+-------+

Truy vấn ORDER BY Value*1, Value (sắp xếp số học, tie-break bằng chuỗi)

mysql> select * from DemoTable order by Value*1, Value;

Kết quả (numeric sort đúng):

+-------+
| Value |
+-------+
| 045   |
| 45    |
| 085   |
| 85    |
| 86    |
| 090   |
| 90    |
+-------+

Giải thích:

  • Value*1: Ép kiểu VARCHAR → NUMBER (MySQL tự động cast). '045'*1 = 45, '45'*1 = 45
  • ORDER BY Value*1, Value: Sắp xếp chính theo giá trị số, nếu bằng nhau (45 và 045) thì sắp xếp phụ theo chuỗi gốc ('045' < '45' lexicographically)
  • Kết quả: 45 (045, 45), 85 (085, 85), 86, 90 (090, 90)

Lưu ý: Cách này không dùng index trên cột Value (do có biểu thức). Với bảng lớn, cân nhắc: thêm cột INT computed/generated column, hoặc lưu số dưới dạng INT riêng biệt.