SQL 版本号排序

SQL 语句直接对内容为版本号格式的字段进行排序时,排序效果通常不是最终想要的效果,因为最终需要的效果,是需对版本号里的每一段(通常以小数点分隔)按数值进行排序。

解决这个问题,主要借助 SUBSTRING_INDEX(str, delim, count) 函数分段提取,再结合结合 CAST() 函数进行类型转换,转换成数值并排序。

SUBSTRING_INDEX 函数从 str 的开始位置取值,由 delim 指定分隔符,取第 count 个分隔符前面部分的内容,其中 count 为负数时,从末尾取值。在嵌套使用的时候,可以指定单独取原始顺序的第2段、第3段等,可以取任意连续1至N段。

例如:

SELECT SUBSTRING_INDEX('192.168.10.15', '.', 1) AS v
UNION SELECT SUBSTRING_INDEX('192.168.10.15', '.', 2)
UNION SELECT SUBSTRING_INDEX('192.168.10.15', '.', 3)
UNION SELECT SUBSTRING_INDEX('192.168.10.15', '.', 4);

效果:

SQL 版本号排序

嵌套使用 SUBSTRING_INDEX() 函数,并结合 CAST() 函数将结果转换为数值排序:

SELECT v,
CAST(SUBSTRING_INDEX(v, '.', 1) AS UNSIGNED) AS v1,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(v, '.', 2), '.', -1) AS UNSIGNED) AS v2,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(v, '.', 3), '.', -1) AS UNSIGNED) AS v3,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(v, '.', 4), '.', -1) AS UNSIGNED) AS v4
FROM (
    SELECT '6.3.5.5' AS v
    UNION SELECT '10.1.1.8'
    UNION SELECT '1.2.3.17'
    UNION SELECT '1.12.3.6'
    UNION SELECT '1.12.250.5'
    UNION SELECT '256.12.3.4'
) AS t
ORDER BY v1 DESC, v2 DESC, v3 DESC, v4 DESC;

效果:

SQL 版本号排序

若版本号只有3段的,则可以去掉上述 v4 部分。

另外,也可以不需要添加到查询的列里,直接放在 ORDER BY 子句中:

SELECT v
FROM (
    SELECT '6.3.5.5' AS v
    UNION SELECT '10.1.1.1'
    UNION SELECT '1.2.3.4'
    UNION SELECT '1.12.3.4'
    UNION SELECT '1.12.250.4'
    UNION SELECT '256.12.3.4'
) AS t
ORDER BY
CAST(SUBSTRING_INDEX(v, '.', 1) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(v, '.', 2), '.', -1) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(v, '.', 3), '.', -1) AS UNSIGNED) DESC,
CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(v, '.', 4), '.', -1) AS UNSIGNED) DESC;

效果:

SQL 版本号排序

另外,结合 INET_ATON(str) 函数可以把输入参数按IP地址格式排序,但是如果存在其中一段的数值超过255的记录,则排序对该记录不生效或结果不符合预期;若可以保证每一段均不超过255,则可以直接使用该函数辅助排序,省事。

Original: https://www.cnblogs.com/tods/p/16396714.html
Author: Tod’s
Title: SQL 版本号排序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621684/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mybatis order by concat用法

    由于项目中用到了一个关联查询,关联的表中都有id字段,在排序时,使用${id},获取值时,一直报 Column ‘id’ in order clause i…

    数据库 2023年6月11日
    069
  • 符合标准的正常工作的对联广告(漂浮广告JS代码)

    符合标准的正常工作的对联广告JS代码(漂浮广告)。DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN…

    数据库 2023年6月11日
    066
  • 计算机组成原理——组成篇

    计算机的总线 1 、总线的作用及概述 解决设备间通讯问题。 总线是为了解决不同设备之间的通信问题。 总线可以连接CPU和IO设备。 2 、总线分类:片内总线、系统总线 片内总线:连…

    数据库 2023年6月16日
    050
  • 3_MyBatis

    一. 引言 1.1 什么是框架? 软件的半成品, 解决了软件开发过程中的普适性问题, 从而简化了开发步骤, 提升了开发效率 1.2 什么是ORM框架? ORM(Object Rel…

    数据库 2023年6月11日
    071
  • MySQL索引知识点&面试常见问题

    来源:BiggerBoy作者:北哥原文链接:https://mp.weixin.qq.com/s/fucHvdRK5wRrDfBOo6IBGw 大家好我是北哥,今天整理了MySQL…

    数据库 2023年6月11日
    076
  • Linux下Oracle单实例配置多监听

    Oracle单实例配置多监听 一、前言 有时候我们项目中需要使用Oracle数据库,同时要需要不同的数据源,而Oracle不像Mysql那样直接建个库即可,Oracle是以账号为单…

    数据库 2023年6月16日
    0103
  • 日志:Redo Log 和 Undo Log

    本篇文章主要介绍 Redo Log 和 Undo Log: 利用 Redo Log 和 Undo Log 实现本地事务的原子性、持久性 Redo Log 的写回策略 Redo Lo…

    数据库 2023年6月11日
    076
  • NO.5 MySQL-笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月14日
    055
  • 从join的实现窥探MySQL迭代器

    以如下left join查询语句为范例: select * from t1 left join t2 on t1.c=t2.a ; 以下初始化数据: 1 DROP TABLE IF…

    数据库 2023年6月11日
    082
  • MyBatis + SpringMVC 总结

    创建 MyBatis 的主配置文件(mybatis-config.xml):环境,事务管理,数据源 给类取别名 配置支持懒加载 创建接口以及接口的映射文件(UserMapper,U…

    数据库 2023年6月11日
    083
  • 存储过程procedure、触发器trigger

    一、存储过程procedure MySQL 5.0 版本开始支持存储过程。 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对…

    数据库 2023年6月9日
    070
  • 【黄啊码】小程序:九宫格抽奖如何实现?可控制抽奖率

    如果让你用微信小程序获取经纬度,然后在后台计算距离,返回数据 一般人的逻辑就是:getLocation之后直接request 然而,当你request后才发现,根本没有弹窗,wha…

    数据库 2023年6月16日
    0132
  • windows与linux查看文件md5值

    windows CertUtil -hashfile FilePath MD5 linux md5sum FilePath Original: https://www.cnblog…

    数据库 2023年6月11日
    076
  • Java中AES加密和解密的方法分享

    转自: http://www.java265.com/JavaJingYan/202206/16559759223818.html 下文笔者讲述java代码实现的AES加密和解密的…

    数据库 2023年6月11日
    088
  • 尤娜,我去面试了

    前情回顾 从前,有一个简单的通道系统叫尤娜…… 尤娜系统的第一次飞行中换引擎的架构垂直拆分改造 四种常用的微服务架构拆分方式 面试前几天 尤娜系统经过一次拆…

    数据库 2023年6月6日
    072
  • Java面试题(十)–Spring Cloud

    1 基础知识篇 1、什么是微服务架构? 微服务架构是一种架构模式或者说是架构风格,它提倡将单一应用程序划分成一组小的服务。每个服务运行在其独立的自己的进程中服务之间相互配合、相互协…

    数据库 2023年6月16日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球