如何使用SQL Server查询对“版本号”列进行常规排序

如何使用SQL Server查询对“版本号”列进行常规排序,sql,sql-server,sorting,sql-server-2000,Sql,Sql Server,Sorting,Sql Server 2000,我想知道我们当中的SQL天才是否能帮我一把 我在包含“版本号”值的表版本中有一列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

我想知道我们当中的SQL天才是否能帮我一把

我在包含“版本号”值的表版本中有一列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
所以,我需要做的是按数字的相反顺序排序,例如在a.b.c.d中,我需要按d,c,b,a排序,以得到正确的排序顺序

但我被困于如何以一种通用的方式实现这一点。当然,我可以使用各种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
SELECT versionNo FROM Versions ORDER BY SUBSTRING_INDEX(versionNo, '.', 1) + 0, SUBSTRING_INDEX(SUBSTRING_INDEX(versionNo, '.', -3), '.', 1) + 0, SUBSTRING_INDEX(SUBSTRING_INDEX(versionNo, '.', -2), '.', 1) + 0, SUBSTRING_INDEX(versionNo, '.', -1) + 0;
能,有人有什么建议吗?非常感谢您的帮助。

如果可以,请更改架构,使版本有4列而不是一列。那么排序就很容易了。

根据SQL engine for MySQL,排序如下:

VersionNo
---------
1.2.3.1
1.3
1.4.7.2
1.7.1
1.10.3.1
1.16.8.0.1
SELECT versionNo FROM Versions ORDER BY SUBSTRING_INDEX(versionNo, '.', 1) + 0, SUBSTRING_INDEX(SUBSTRING_INDEX(versionNo, '.', -3), '.', 1) + 0, SUBSTRING_INDEX(SUBSTRING_INDEX(versionNo, '.', -2), '.', 1) + 0, SUBSTRING_INDEX(versionNo, '.', -1) + 0; 对于MySQL版本3.23.15及以上版本

SELECT versionNo FROM Versions ORDER BY INET_ATON(ip);
如果您使用的是SQL Server 2008

select VersionNo from Versions order by cast('/' + replace(VersionNo , '.', '/') + '/' as hierarchyid);
编辑:

2000年、2005年、2008年的解决方案:

另一种方法是:

假设您只有a、b、c、d,那么您也可以将数据分离到列中,并按a、b、c、dall desc进行排序,得到最上面的1行

如果你需要缩放到d以上,比如e,f,g。。。只需在查询中将1,2,3,4更改为1,2,3,4,5,6,7,依此类推

查询:


哈哈,是的,我想到了,不幸的是,这不是一个选择。另外,长度可能是可变的,我不能保证最大列数为4,或者其他任何东西。如果您使用的SQL Server 2005可能是2008年,需要进行双重检查或更新,您可以编写一个.NET CLR方法来进行比较,或者更好的是,将任意版本号转换为规范,可排序格式,例如,将每个部分填充到5位数字;在数据库中注册这个CLR方法,您可以像调用常规SQL函数一样调用它。否则,您将不得不在SQL中实现相同的东西,这可能会对您的性能造成不利影响。是的,不幸的是,这是VB6和SQL 2000中的一个旧内部应用程序。在最后一种情况下,如果您没有4种东西可供排序,您希望如何对其进行排序?如图所示。这是我的问题,如果它被修复了,那将是一件轻而易举的事。它的SQL Server正如标签所示,但是已经相应地更新了我的问题。最后,一个有效的解决方案,谢谢!请注意,如果数字不都低于256,INET_ATON将无法正常工作。如果是的话。但不幸的是,我被旧的SQL 2000卡住了。@James Wiseman:在链接中,你应该找到解决方案。@James-不确定你最终使用了什么。你也可以用parsename来表示这个问题,就像在这个答案中一样@Martin:我实际上用过这个,但我也喜欢你的建议。谢谢。看起来不需要替换圆点。您可以使用以下选项:按cast“/”+VersionNo+“/”从版本顺序选择*作为层次结构ID;