Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL字符串按照数值排序

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文