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)

大家都在看

  • Dubbo源码(一)-SPI使用

    Dubbo 的可扩展性是基于 SPI 去实现的,而且Dubbo所有的组件都是通过 SPI 机制加载。 SPI 全称为 (Service Provider Interface) ,是…

    数据库 2023年6月11日
    096
  • 第十七章 AOP编程

    1.AOP概念 AOP(Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基本单位的程序开发,通过切面间的相互协同,相互调…

    数据库 2023年6月14日
    0100
  • 在Debian系统上安装StoneDB数据库

    今天我会进行StoneDB数据库在Debian系统下的安装。官方文档中没有说明在Debian系统的安装步骤,我来试试能否顺利安装。 准备Debian系统 我是在本地使用虚拟机安装的…

    数据库 2023年5月24日
    081
  • Java的日志框架之Logback

    前言 在Java的日志系统里面,有两个概念,一个叫做日志框架,如我们熟悉的Logback, Log4j, Log4j2, JDK自带的java.util.logging等;一个叫做…

    数据库 2023年6月11日
    083
  • 限流常见方案

    限流常见方案 我歌月徘徊,我舞影零乱。醒时相交欢,醉后各分散。 一、限流思路 常见的系统服务限流模式有:熔断、服务降级、延迟处理和特殊处理四种。 1、熔断 将熔断措施嵌入到系统设计…

    数据库 2023年6月14日
    094
  • SQLZOO练习7–Using NULL

    teacher表: iddeptnamephonemobile 101 1 Shrivell 2753 07986 555 1234 102 1 Throd 2754 07122 …

    数据库 2023年6月16日
    068
  • MySQL的Explain总结

    Explain简介 MySQL优化器在基于成本的计算和基于规则的SQL优化会生成一个所谓的 执行计划,我们就可以使用执行计划查看MySQL对该语句具体的执行方式。 介绍这个好啰嗦就…

    数据库 2023年5月24日
    080
  • LeetCode 27. 移除元素

    给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用O(1)额外空间并 原地 修改输入数…

    数据库 2023年6月11日
    081
  • AI听曲识歌!哼曲、口哨吹,都能秒识! ⛵

    💡 作者:韩信子@ShowMeAI📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42📘 自然语言处理实战系列:https://www…

    数据库 2023年6月14日
    0112
  • 一个属性同时使用Autowired和Resource注解会发生什么?

    首发于公众号:BiggerBoy右侧图片wx扫码关注有惊喜欢迎关注,查看更多技术文章 如题,如果在同一个属性上使用@Autowired注解注入bean1,然后使用@Resource…

    数据库 2023年6月11日
    078
  • idea 导入项目MAVEN报错,jdk与jms问题,以及@override报错

    一: Plugins报错: compiler Failed to execute goal org.apache.maven.plugins:maven-compiler-plug…

    数据库 2023年6月11日
    0108
  • webclient设置代理

    https://qa.1r1g.com/sf/ask/4102971771/ 本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://…

    数据库 2023年6月11日
    074
  • 常用函数封装汇总

    常用函数封装 获取某日期若干个工作日后的日期 * 参数: * time: [String] 给&#x5B9…

    数据库 2023年6月11日
    0112
  • Mybatis-Plus一键生成代码

    Mybatis-Plus一键生成代码 一、闲言碎语 闲来无事看了看了MP的官网看到一键生成的代码更新了! 整个Ui风格都变了,遂决定瞅一眼新的代码生成器 官网地址~~ 二、引入依赖…

    数据库 2023年5月24日
    075
  • [Mysql]Ubuntu如何安装Mysql+启用远程连接[完整版]

    唉。下面是我花了不知道多少个小时踩过的所有坑总结出来的血泪史,希望能帮你们少踩一些坑吧,正常来讲一步一步下来就不会出现任何问题了。 背景 用的是百度云的云服务器(其他云服务器同理)…

    数据库 2023年6月16日
    086
  • 使用MySQL Shell创建MGR

    本篇知识点: 配置MGR所需的参数 使用MySQL Shell配置MGR shell.connect() var 设定临时变量 dba.createCluster() dba.ge…

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