SQL 对版本数字 + 字符串进行排序

SQL Sort verions numeric + string

我必须按版本列对 table 进行排序,这是一个随机字符串 + 数字 (x.xx.xx)。例如我的 table 看起来像:

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)```


像这样的东西应该可以工作:

order by
    cast(
        substring_index(
            substring_index(a_name, ' ', -1),
            '.', 
            1
         ) 
         as unsigned
    ) desc,
    cast(
        right(
            substring_index(a_name, ' ', -1),
            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,
         substring_index(a_name, '.', -1) + 0

假设您的 "random string" 中没有 space,这应该会给您预期的结果。

select 
    *
from 
    your_table
order by 
    cast('/' + TRIM(SUBSTRING(your_version_col,CHARINDEX(' ', your_version_col),LEN(your_version_col)))  + '/' as hierarchyid) desc