如何对“版本号”进行排序一般使用 SQL Server 查询的列
我想知道我们当中的 SQL 天才是否可以向我伸出援助之手。
我在表 Versions
中有一个列 VersionNo
,其中包含“版本号”值等
VersionNo
---------
1.2.3.1
1.10.3.1
1.4.7.2
。
我希望对其进行排序,但不幸的是,当我执行标准 order by
,它被视为一个字符串,因此顺序结果如下而
VersionNo
---------
1.10.3.1
1.2.3.1
1.4.7.2
不是以下,这就是我所追求的:
VersionNo
---------
1.2.3.1
1.4.7.2
1.10.3.1
所以,我需要做的是按相反顺序对数字进行排序(例如,在 abcd 中,我需要按 d、c、b、a 排序才能获得正确的排序(ourder)。
但我对如何以通用方式实现这一目标感到困惑。当然,我可以使用各种 sql 函数分割字符串(例如 left
、right
、substring
、len
, charindex
),但我不能保证版本号始终由 4 部分组成。我可能有一个这样的清单:
VersionNo
---------
1.2.3.1
1.3
1.4.7.2
1.7.1
1.10.3.1
1.16.8.0.1
可以,有人有什么建议吗?我们将非常感谢您的帮助。
I wonder if the SQL geniuses amongst us could lend me a helping hand.
I have a column VersionNo
in a table Versions
that contains 'version number' values like
VersionNo
---------
1.2.3.1
1.10.3.1
1.4.7.2
etc.
I am looking to sort this, but unfortunately, when I do a standard order by
, it is treated as a string, so the order comes out as
VersionNo
---------
1.10.3.1
1.2.3.1
1.4.7.2
Intead of the following, which is what I am after:
VersionNo
---------
1.2.3.1
1.4.7.2
1.10.3.1
So, what I need to do is to sort by the numbers in reverse order (e.g. in a.b.c.d, I need to sort by d,c,b,a to get the correct sort ourder).
But I am stuck as to how to achieve this in a GENERIC way. Sure, I can split the string up using the various sql functions (e.g. left
, right
, substring
, len
, charindex
), but I can't guarantee that there will always be 4 parts to the version number. I may have a list like this:
VersionNo
---------
1.2.3.1
1.3
1.4.7.2
1.7.1
1.10.3.1
1.16.8.0.1
Can, does anyone have any suggestions? Your help would be much appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您使用的是 SQL Server 2008
什么是 hierarchyid
编辑:
2000 的解决方案,2005 年,2008 年:T- 的解决方案这里是 SQL 排序挑战。
挑战
If You are using SQL Server 2008
What is hierarchyid
Edit:
Solutions for 2000, 2005, 2008: Solutions to T-SQL Sorting Challenge here.
The challenge
根据 MySQL 的 SQL 引擎,情况如下:
对于 MySQL 版本 3.23.15 及以上
Depending on SQL engine for MySQL would be sth like this:
For MySQL version 3.23.15 an above
如果可以,请更改架构,使版本有 4 列而不是 1 列。然后排序就很容易了。
If you can, alter the schema so that the version has 4 columns instead of one. Then sorting is easy.
另一种方法:
假设您只有 a、b、c、d,您也可以将数据分成列,并按 a、b、c、d(全部降序)进行排序并获取前 1 行
中将 1,2,3,4 更改为 1,2,3,4,5,6,7 等
如果您需要缩放到超过 d 表示 e,f,g...只需在查询Query :
查看演示
Another way to do it:
Assuming you only have a,b,c,d only you may as well separate the data out to columns and do an order by a,b,c,d(all desc) and get the top 1 row
If you need to scale to more than d to say e,f,g... just change 1,2,3,4, to 1,2,3,4,5,6,7 and so on in the query
Query :
see demo