SQL按版本"number"排序,这是一个长度不一的字符串

28 sql

我正在尝试创建一个SQL查询,它将按版本号(例如1.1,4.5.10等)对结果进行排序

这是我试过的:

SELECT * FROM Requirements 
    WHERE Requirements.Release NOT LIKE '%Obsolete%' 
    ORDER BY Requirements.ReqNum
Run Code Online (Sandbox Code Playgroud)

现在,ReqNum字段是一个字符串字段,不幸的是我无法将其更改为浮点数或类似的东西,因为我有需求数字162.1.11.

当我得到结果时,我会得到这样的订购:

1.1
1.10
1.11
1.3
Run Code Online (Sandbox Code Playgroud)

如何编写将按字典顺序排序的查询?

... 要么,

如何正确排序数据?

感谢提前输入!

小智 27

在PostgreSQL中你可以做到:

SELECT * FROM Requirements
ORDER BY string_to_array(version, '.')::int[];
Run Code Online (Sandbox Code Playgroud)

这最后::int[]使它将字符串值转换为整数,然后进行比较.

  • 这肯定是这里所有答案中最简单,最有效的方法吗? (2认同)

Joe*_*orn 24

为获得最佳结果,请重构版本号存储,以便每个部分都有自己的列:MajorVersion,MinorVersion,Revision,Build.然后订购问题突然变得微不足道.您还可以构建计算列以便轻松检索完整字符串.


Vut*_* L. 13

SELECT * FROM Requirements 
WHERE Requirements.Release NOT LIKE '%Obsolete%' 
ORDER BY cast('/' + replace(Requirements.ReqNum , '.', '/') + '/' as hierarchyid);
Run Code Online (Sandbox Code Playgroud)

  • 请解释一下你的代码,它更有效地解释代码,而不是发布它. (5认同)

Geb*_*ebb 8

@ vuttipong-l答案(T-SQL)略有不同

SELECT VersionNumber
FROM (
SELECT '6.1.3' VersionNumber UNION
SELECT '6.11.3' UNION
SELECT '6.2.3' UNION
SELECT '6.1.12' 
) AS q
ORDER BY cast('/' + VersionNumber + '/' as hierarchyid)
Run Code Online (Sandbox Code Playgroud)

在从2008开始的SQL Server中工作,在hierarchyid列的字符串表示中点可以,因此我们不需要用斜杠替换它们.来自doc的引用:

通过比较按字典顺序由点分隔的整数序列来执行比较.

但有一点需要注意:版本段不能以零为前缀.


bea*_*ach 7

如果您在 SQL Server 领域...

DECLARE @string varchar(40)
SET @string = '1.2.3.4'
SELECT PARSENAME(@string, 1), PARSENAME(@string, 2), PARSENAME(@string, 3), PARSENAME(@string, 4)
Run Code Online (Sandbox Code Playgroud)

结果:4、3、2、1

用于解析 IP 地址和其他虚线项目,例如版本号。(您也可以使用 REPLACE() 将项目转换为点符号...例如 1-2-3-4 -> 1.2.3.4)

  • 我知道这已经有好几年了,但它是我本月遇到的最有用的黑客。谢谢! (2认同)