MySQL字符串按照数值排序方式

 更新时间:2023年08月25日 09:01:14   作者: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

总结

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

相关文章

  • mysql 5.7.21 安装配置方法图文教程(window)

    mysql 5.7.21 安装配置方法图文教程(window)

    这篇文章主要为大家详细介绍了window环境下mysql5.7.21安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • MySQL 5.7之关于SQL_MODE的设置

    MySQL 5.7之关于SQL_MODE的设置

    这篇文章主要介绍了MySQL 5.7之关于SQL_MODE的设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Mysql的语句生成后门木马的方法

    Mysql的语句生成后门木马的方法

    这篇文章主要介绍了Mysql的语句生成后门木马的方法,大家不要随意搞破坏哦,小伙伴们学习下就好了。
    2015-04-04
  • MYSQL Left Join优化(10秒优化到20毫秒内)

    MYSQL Left Join优化(10秒优化到20毫秒内)

    在实际开发中,相信大多数人都会用到join进行连表查询,但是有些人发现,用join好像效率很低,而且驱动表不同,执行时间也不同。那么join到底是如何执行的呢,本文就详细的介绍一下
    2021-12-12
  • mysql 8.0.11压缩包版本安装教程

    mysql 8.0.11压缩包版本安装教程

    这篇文章主要为大家详细介绍了mysql 8.0.11压缩包版本安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • mysql事务隔离级别详解

    mysql事务隔离级别详解

    MySQL事务隔离级别是指在多个事务同时执行时,数据库系统如何处理这些事务之间的相互影响。MySQL提供了四种隔离级别:读未提交、读已提交、可重复读和串行化。每种隔离级别都有其优缺点,需要根据具体情况选择合适的级别。
    2023-06-06
  • mysql 存储过程判断重复的不插入数据

    mysql 存储过程判断重复的不插入数据

    这篇文章主要介绍了下面是一个较常见的场景,判断表中某列是否存在某值,如果存在执行某操作,需要的朋友可以参考下
    2017-01-01
  • mysql数据NULL避坑指南分享

    mysql数据NULL避坑指南分享

    这篇文章主要介绍了mysql数据NULL避坑指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 如何使Mysql自动生成序号列,序号自动增长问题

    如何使Mysql自动生成序号列,序号自动增长问题

    这篇文章主要介绍了如何使Mysql自动生成序号列,序号自动增长问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • JDBC连接MySQL5.7的方法

    JDBC连接MySQL5.7的方法

    这篇文章主要介绍了JDBC连接MySQL5.7的方法,需要的朋友可以参考下
    2018-05-05

最新评论