使构建号可排序

时间:2017-04-19 13:43:59

标签: sql-server tsql sorting

我有一系列构建号,存储为VARCHAR:

BUILDID
15.40.417
16.40.11014
17.0.667
17.0.700
17.0.703
17.0.710
17.1.137
17.1.141
17.1.142
17.1.151
17.1.167
17.1.211
87年1月17日
88年1月17日
12年10月17日
17.20.7
17.25.3
17.25.5
17.30.1

我们发现排序时不使用前导零的常见问题。我想过将数字分开并创建一个BIGINT。有没有更好的方法来排序这些?

1 个答案:

答案 0 :(得分:0)

我最终完成了这个功能:

-- =============================================
-- Author:      Dan Andrews
-- Create date: 4/19/2017
-- Description: Converts Build IDs (17.20.1) to INTs (17020001)
-- =============================================
ALTER FUNCTION fn_BuildID2INT(@buildID VARCHAR(50))
RETURNS BIGINT
AS
BEGIN
  DECLARE
    @xml   XML
  , @value BIGINT = 10000000000
  , @total BIGINT = 0;
  SET @xml = CAST('<X>'+REPLACE(@buildID , '.' , '</X><X>')+'</X>' AS XML);
  SELECT
    @total+=C.value('.' , 'int')*@value
  , @value/=100000
  FROM
    @xml.nodes('X') AS X(C);
  RETURN @total;
END;
GO
GRANT EXECUTE ON fn_BuildID2INT TO public;

这给了我这个:

缬氨酸
150004000417
160004011014
170000000667
170000000700
170000000703
170000000710
170000100137
170000100141
170000100142
170000100151
170000100167
170000100211
170000100087
170000100088
170001000012
170002000007
170002500003
170002500005
170003000001

但......作为Martin Smith pointed out hereORDER BY CAST('/' + YourColumn + '/' AS HIERARCHYID)甚至更好。