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
想法是:
把字符串和版本号分开
隔离版本号的第一位数字(并将其转换为整数值)并将其用作第一个排序标准
然后将第二部分和第三部分分离,将其转换为十进制值,并将其用作第二个排序标准
| 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
我必须按版本列对 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
想法是:
把字符串和版本号分开
隔离版本号的第一位数字(并将其转换为整数值)并将其用作第一个排序标准
然后将第二部分和第三部分分离,将其转换为十进制值,并将其用作第二个排序标准
| 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