如何在T-SQL中获取版本号(varchar)列的MAX值

时间:2010-06-16 22:09:09

标签: sql-server tsql sorting max varchar

我有一个像这样定义的表:

Column:  Version     Message
Type:    varchar(20) varchar(100)
----------------------------------
Row 1:    2.2.6       Message 1
Row 2:    2.2.7       Message 2
Row 3:    2.2.12      Message 3
Row 4:    2.3.9       Message 4
Row 5:    2.3.15      Message 5

我想编写一个T-Sql查询,该查询将获取MAX版本号的消息,其中“Version”列表示软件版本号。即2.2.12大于2.2.7,2.3.15大于2.3.9等等。不幸的是,如果不使用CHARINDEX或其他复杂的其他类似分裂的逻辑,我想不出一个简单的方法。 。运行此查询:

SELECT MAX(Version) FROM my_table

会产生错误的结果:

2.3.9

什么时候应该 2.3.15 。任何不太复杂的好主意?

2 个答案:

答案 0 :(得分:10)

一种解决方案是使用表值拆分函数将版本拆分为行,然后将它们组合回列中,以便您可以执行以下操作:

Select TOP 1 Major, Minor, Build
From ( ...derived crosstab query )
Order By Major Desc, Minor Desc, Build Desc

实际上,另一种方法是使用PARSENAME函数来分割对象名称:

Select TOP 1 Version
From Table
Order By Cast(Parsename( Z.Version , 3 ) As Int) Desc
    , Cast(Parsename( Z.Version , 2 ) As Int) Desc
    , Cast(Parsename( Z.Version , 1 ) As Int) Desc

答案 1 :(得分:3)

是否必须在大桌子上高效?我建议你创建一个索引持久计算列,将版本转换为正确排序的格式,并在查询中使用计算列。否则,您将始终端到端扫描。

如果表格很小,则无关紧要。然后你可以使用拆分功能进行实时排名,或者(ab)使用Thomas建议的解析名称。