Khi cột lưu số dưới dạng VARCHAR, sắp xếp mặc định là theo thứ tự chữ (lexicographic): 1, 10, 100, 2, 20.... Cần ép kiểu sang số để sắp xếp đúng.
Cú pháp dùng CAST()
SELECT * FROM table_name ORDER BY CAST(string_column AS DECIMAL(precision, scale)) DESC;
Ví dụ minh họa
mysql> CREATE TABLE SortingStringDemo (Amount VARCHAR(10));
Query OK, 0 rows affected (0.91 sec)
mysql> INSERT INTO SortingStringDemo VALUES
('12.34'), ('124.50'), ('9.59'), ('150.68'), ('600.54');
Query OK, 5 rows affected
Sắp xếp giảm dần (DESC):
mysql> SELECT * FROM SortingStringDemo ORDER BY CAST(Amount AS DECIMAL(6,2)) DESC;
Kết quả:
+--------+ | Amount | +--------+ | 600.54 | | 150.68 | | 124.50 | | 12.34 | | 9.59 | +--------+
Các cách ép kiểu khác
CAST(Amount AS UNSIGNED)- cho số nguyên không dấuCAST(Amount AS SIGNED)- cho số nguyên có dấuAmount + 0- ép kiểu ngầm (MySQL tự chuyển sang số)CAST(Amount AS DECIMAL(10,2))- chính xác cho tiền tệ
Ví dụ với Amount + 0
SELECT * FROM SortingStringDemo ORDER BY (Amount + 0) DESC;
Lưu ý
- Nếu dữ liệu có giá trị không phải số,
CASTtrả về 0 hoặc NULL tùy chế độ SQL. - Nên lưu trữ số ở kiểu số (INT, DECIMAL) thay vì VARCHAR nếu có thể.
DECIMAL(6,2)nghĩa là tổng 6 chữ số, 2 chữ số sau dấu phẩy.