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[]使它将字符串值转换为整数,然后进行比较.
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)
@ 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的引用:
通过比较按字典顺序由点分隔的整数序列来执行比较.
但有一点需要注意:版本段不能以零为前缀.
如果您在 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)
| 归档时间: |
|
| 查看次数: |
18315 次 |
| 最近记录: |