龙空技术网

mysql数据库个性化需求:版本号排序

波波说运维 1291

前言:

当前看官们对“mysql排序首字母”都比较关怀,同学们都想要分析一些“mysql排序首字母”的相关内容。那么小编也在网络上汇集了一些有关“mysql排序首字母””的相关知识,希望咱们能喜欢,姐妹们一起来了解一下吧!

概述

今天主要介绍一个MySQL数据库版本号排序问题,一起来看看吧~

需求

按版本号排序,版本号字段为字符类型,其中1.2.10应大于1.2.9,但mysql数据库会认为1.2.9大于1.2.1

正确的版本号应该是

1.3.0 大于 1.2.23

1.2.10 大于 1.2.9

实现sql(错误示范)

这里以符号"."分隔并取各个值后组合排序,但仍存在问题

SELECT	version FROM	lcp_app_version ORDER BY	concat(		substring_index( version, '.', 1 ),		substring_index( substring_index( version, '.', 2 ), '.',- 1 ),	substring_index( version, '.',- 1 ) 	) DESC;

SQL解决方案一

一般版本号排序,思路是去掉小数点,右边补零防止错误填写,类型转换为数字然后排序

select version ,CONCAT(LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( version, '.', 1 ), '.', - 1 ), 3, '0' ),LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( version, '.', 2 ), '.', - 1 ), 3, '0' ),LPAD(CASE WHEN LENGTH(SUBSTRING_INDEX( version, '.', 3 ))=LENGTH(SUBSTRING_INDEX( version, '.', 2 ))THEN '000'ELSE SUBSTRING_INDEX( SUBSTRING_INDEX( version, '.', 3 ), '.', - 1 ) END , 3, '0' ) ) as vvfrom lcp_app_version  order by vv desc;

SQL解决方案二

以小数点分隔,取各个值,然后逐步按每个值排序

SELECT	version,SUBSTRING_INDEX(version,'.',1) AS first_version,SUBSTRING_INDEX(SUBSTRING_INDEX(version,'.',-2),'.',1) AS second_version,SUBSTRING_INDEX(version,'.',-1) AS third_versionFROM	lcp_app_versionorder BY first_version+0 desc,second_version+0 desc,third_version+0 desc

后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下!

标签: #mysql排序首字母