概述
今天主要介绍一个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(错误示范)
这里以符号"."分隔并取各个值后组合排序,但仍存在问题
SELECTversion FROMlcp_app_version ORDER BYconcat(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解决方案二
以小数点分隔,取各个值,然后逐步按每个值排序
SELECTversion,SUBSTRING_INDEX(version,'.',1) AS first_version,SUBSTRING_INDEX(SUBSTRING_INDEX(version,'.',-2),'.',1) AS second_version,SUBSTRING_INDEX(version,'.',-1) AS third_versionFROMlcp_app_versionorder BY first_version+0 desc,second_version+0 desc,third_version+0 desc
后面会分享更多devops和DBA方面内容,感兴趣的朋友可以关注下!