当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《SQL按版本"number"排序,这是一个长度不一的字符串》经验,为你挑选了4个好方法。

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

这是我试过的:

SELECT * FROM Requirements 
    WHERE Requirements.Release NOT LIKE '%Obsolete%' 
    ORDER BY Requirements.ReqNum

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

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

1.1
1.10
1.11
1.3

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

... 要么,

如何正确排序数据?

感谢提前输入!



1> 小智..:

在PostgreSQL中你可以做到:

SELECT * FROM Requirements
ORDER BY string_to_array(version, '.')::int[];

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


这肯定是这里所有答案中最简单,最有效的方法吗?

2> Joel Coehoor..:

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



3> Vuttipong L...:
SELECT * FROM Requirements 
WHERE Requirements.Release NOT LIKE '%Obsolete%' 
ORDER BY cast('/' + replace(Requirements.ReqNum , '.', '/') + '/' as hierarchyid);


请解释一下你的代码,它更有效地解释代码,而不是发布它.

4> Gebb..:

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

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

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

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

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有