我对sql完全陌生,但是今天我在工作中的sql查询中发现了一个非常重要的错误。因此,我可以使用一些帮助:
给定一个代表产品版本的sql字符串
‘15 .0.0.0’
是否有一种万无一失的方式来排序或比较该字符串,类似于.NET类System.Version如何比较实例?
因此,给定这样一个假设的构造,功能或任何形式,我希望‘15 .5.568’大于‘15 .0.0.0’。
谢谢
假设有SQL Server和已知的最大部件数,这是一个用户定义的函数,与的功能相同parsename,但可以在任意数量的部件上使用:
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