MySQL字符串按照数值排序方式
作者:JustDI-CM
这篇文章主要介绍了MySQL字符串按照数值排序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
MySQL字符串按照数值排序
1.需求
MySQL 有个表字段设计的时候,设置为了 varchar 类型,存取的却是数值,后续有业务需要按照此字段排序,获取最大值。
按照最原始的排序语句为:
SELECT * FROM test_21 a ORDER BY a.testId desc;
结果为:
这个并不是想要的结果。
2.方法
改造一下
1)与 int 进行计算
SELECT * FROM test_21 a ORDER BY a.testId+0 desc; SELECT * FROM test_21 a ORDER BY a.testId-2 desc; SELECT * FROM test_21 a ORDER BY a.testId*1 desc; SELECT * FROM test_21 a ORDER BY a.testId/4 desc;
MySQL 的 varchar 与 int 计算时,会转换为 int。
以上4个 sql 的执行结果都为
2)cast() 或 convert()
SELECT * FROM test_21 a ORDER BY cast(a.testId as SIGNED) desc; SELECT * FROM test_21 a ORDER BY convert(a.testId,SIGNED) desc;
这两个函数都是用于格式转换的,二者没什么区别,
语法为:
CAST(expr AS type) CONVERT(expr,type)
支持的类型有
值 | 说明 |
---|---|
DATE | 将expr转换成’YYYY-MM-DD’格式 |
DATETIME | 将expr转换成’YYYY-MM-DD HH:MM:SS’格式 |
TIME | 将expr转换成’HH:MM:SS’格式 |
CHAR | 将expr转换成CHAR(固定长度的字符串)格式 |
SIGNED | 将expr转换成INT(有符号的整数)格式 |
UNSIGNED | 将expr转换成INT(无符号的整数)格式 |
DECIMAL | 将expr转换成FLOAT(浮点数)格式 |
BINARY | 将expr转换成二进制格式 |
结果都为:
MySQL按字符串数字排序处理
公司不知是谁设计的表菜单排序字段竟然设置成了字符串。
CREATE TABLE `s_menu` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `PARENT_ID` int(11) DEFAULT NULL, `ORDER` varchar(5) DEFAULT NULL, `MENU_NAME` varchar(255) DEFAULT NULL, `MENU_URL` varchar(255) DEFAULT NULL, `MENU_ICON` varchar(100) DEFAULT NULL, `SORT_NUM` int(2) DEFAULT NULL, `IS_SHOW` int(2) DEFAULT NULL, `PERMISSION` varchar(100) DEFAULT NULL, `LOGIN_TYPE` int(11) DEFAULT NULL COMMENT '0:WEB,1:PC,2:APP', `CREATE_BY` int(11) DEFAULT NULL, `CREATE_DATE` date DEFAULT NULL, `MEMO` varchar(1000) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=254 DEFAULT CHARSET=utf8 COMMENT='菜单';
为了减少代码的改动量
SELECT `ID`, `PARENT_ID` , `ORDER` , `MENU_NAME`, `MENU_URL` , `MENU_ICON` , `SORT_NUM` , `IS_SHOW` , `PERMISSION` , `LOGIN_TYPE` , `CREATE_BY` , `CREATE_DATE`, `MEMO` FROM s_menu ORDER BY (s_menu.ORDER+0) ASC
将字符的数字转成数字,比如"123"转成123可以直接用字符数字+0来实现
也可以使用 cast(str as SIGNED)
SELECT `ID`, `PARENT_ID` , `ORDER` , `MENU_NAME`, `MENU_URL` , `MENU_ICON` , `SORT_NUM` , `IS_SHOW` , `PERMISSION` , `LOGIN_TYPE` , `CREATE_BY` , `CREATE_DATE`, `MEMO` FROM s_menu ORDER BY cast (s_menu.ORDER as SIGNED) ASC
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。