代码之家  ›  专栏  ›  技术社区  ›  Ogre Psalm33

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

  •  3
  • Ogre Psalm33  · 技术社区  · 14 年前

    我有一张这样定义的桌子:

    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查询,它将获取有关最大版本号的消息,其中“版本”列表示软件版本号。也就是说,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 回复  |  直到 14 年前
        1
  •  10
  •   Thomas    14 年前

    一种解决方案是使用表值拆分函数将版本拆分成行,然后将它们组合成列,这样您就可以执行如下操作:

    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
    
        2
  •  3
  •   Remus Rusanu    14 年前

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

    如果桌子很小,那就没关系了。然后,您可以使用一个即时排名,使用一个split函数,或者(ab)使用托马斯建议的parseName。