admin

如何比较保存版本号(如.NET System.Version类)的SQL字符串?

sql

我对sql完全陌生,但是今天我在工作中的sql查询中发现了一个非常重要的错误。因此,我可以使用一些帮助:

给定一个代表产品版本的sql字符串

‘15 .0.0.0’

是否有一种万无一失的方式来排序或比较该字符串,类似于.NET类System.Version如何比较实例?

因此,给定这样一个假设的构造,功能或任何形式,我希望‘15 .5.568’大于‘15 .0.0.0’。

谢谢


阅读 157

收藏
2021-06-07

共1个答案

admin

假设有SQL Server和已知的最大部件数,这是一个用户定义的函数,与的功能相同parsename,但可以在任意数量的部件上使用:

Create Function dbo.VersionNthPart(@version as nvarchar(max), @part as int) returns int as
Begin

  Declare
    @ret as int = null,
    @start as int = 1,
    @end as int = 0,
    @partsFound as int = 0

  if @version is not null
  Begin
    Set @ret = 0
    while @partsFound < @part
    Begin
      Set @end = charindex('.', @version, @start)
      If @end = 0
        Set @partsFound = @part -- bail early
      else
      Begin
        Set @partsFound = @partsFound + 1
        If @partsFound = @part
          Set @ret = Convert(int, substring(@version, @start, @end - @start))
        Else
          Set @start = @end + 1
      End
    End
  End
  return @ret
End

用法示例:

With
  tmp
As (
    Select '1.0.0.5' As Version
    Union All Select '1.5.0.06'
    Union All Select '1.0.0.06'
    Union All Select '2.0.0.0'
    Union All Select '2.0.1.1'
    Union All Select '15.5.568'
    Union All Select '15.0.0.0'
    Union All Select '15.15.1323.22'
    Union All Select '15.15.622.55'
)

Select
  *
From
   tmp
Order By
  dbo.VersionNthPart(Version, 1),
  dbo.VersionNthPart(Version, 2),
  dbo.VersionNthPart(Version, 3),
  dbo.VersionNthPart(Version, 4)

http://sqlfiddle.com/#!3/e942b/3

2021-06-07