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

Sắp xếp chuỗi theo giá trị số trong MySQL với CAST()

Khi cột kiểu chuỗi (VARCHAR, CHAR) chứa số (ví dụ: '3', '20', '100'), sắp xếp mặc định ORDER BY col sẽ theo thứ tự từ điển (lexicographical): '100' < '20' < '3'. Để sắp xếp theo giá trị số thực, hãy ép kiểu (CAST) sang số.

Tạo bảng và dữ liệu

mysql> CREATE TABLE DemoTable (Id VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES ('3'), ('20'), ('34'), ('21'), ('78'), ('90');

Sắp xếp mặc định (chuỗi) - SAI

mysql> SELECT * FROM DemoTable ORDER BY Id;
+------+
| Id   |
+------+
| 20   |
| 21   |
| 3    |
| 34   |
| 78   |
| 90   |
+------+

Sắp xếp đúng (số) với CAST(... AS SIGNED/UNSIGNED)

mysql> SELECT * FROM DemoTable ORDER BY CAST(Id AS SIGNED) DESC;
+------+
| Id   |
+------+
| 90   |
| 78   |
| 34   |
| 21   |
| 20   |
| 3    |
+------+

Các kiểu CAST phổ biến

  • CAST(col AS SIGNED): Số nguyên có dấu (cho phép âm).
  • CAST(col AS UNSIGNED): Số nguyên không dấu (0 đến 18446744073709551615).
  • CAST(col AS DECIMAL(10,2)): Số thập phân.
  • CAST(col AS DATE), DATETIME, TIME.

Cú pháp thay thế: CONVERT()

SELECT * FROM DemoTable ORDER BY CONVERT(Id, SIGNED) DESC;

CONVERT là chuẩn SQL, CAST cũng là chuẩn SQL. MySQL hỗ trợ cả hai.

Lưu ý hiệu năng

  • CAST trong ORDER BY làm mất index trên cột gốc (filesort).
  • Nếu truy vấn thường xuyên, cân nhắc:
    • Thay đổi kiểu cột sang INT (nếu dữ liệu sạch).
    • Thêm Generated Column Id_num INT AS (CAST(Id AS UNSIGNED)) STORED và index trên cột đó.