SQL排序版本数字+字符串

我必须按照版本列对表格进行排序,版本列是随机字符串+数字(x.xx.xx)。例如,我的表格如下:

string 1.14.2
string 1.14.1
string 1.14
string 1.14.3
string 1.14.4
string 1.11
string 1.10
string 1.10.2
string 1.9
string 1.9.4
string 1.9.2
string 1.8
string 1.8.8
string 1.4.6

我的结果必须像这样:

string 1.14.4
string 1.14.3
string 1.14.2
string 1.14.1
string 1.11
string 1.10.2
string 1.10
string 1.9.4
string 1.9.2
string 1.9
string 1.8.8
string 1.8
string 1.4.6

我当前的sql是

SELECT * FROM t_plugins WHERE a_category = 'string' AND a_master_ig = 2
ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(trim(a_name)," ",-1),".",-1)```


wgx19820526 回答:SQL排序版本数字+字符串

类似的事情应该起作用:

order by
    cast(
        substring_index(
            substring_index(a_name,' ',-1),'.',1
         ) 
         as unsigned
    ) desc,cast(
        right(
            substring_index(a_name,length(substring_index(a_name,-1)) 
                - locate('.',substring_index(a_name,-1))
        )
        as decimal(10,5)
    ) desc

想法是:

  • 将字符串与版本号分开

  • 隔离版本号的第一位(并将其转换为整数值)并将其用作第一排序标准

  • 然后隔离第二部分和第三部分,将其转换为十进制值,并将其用作第二排序标准

Demo on DB Fiddle

| a_name        |
| :------------ |
| string 1.14.4 |
| string 1.14.3 |
| string 1.14.2 |
| string 1.14.1 |
| string 1.14   |
| string 1.11   |
| string 1.10.2 |
| string 1.10   |
| string 1.9.4  |
| string 1.9.2  |
| string 1.9    |
| string 1.8.8  |
| string 1.8    |
| string 1.4.6  |
,

我认为使用隐式转换会更简单:

order by substring_index(a_name,1) + 0,substring_index(substring_index(a.name,2),-1) + 0,-1) + 0
,

假设“随机字符串”中没有空格,这应该可以为您带来预期的结果。

select 
    *
from 
    your_table
order by 
    cast('/' + TRIM(SUBSTRING(your_version_col,CHARINDEX(' ',your_version_col),LEN(your_version_col)))  + '/' as hierarchyid) desc
本文链接:https://www.f2er.com/3061674.html

大家都在问