我有一系列构建号,存储为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。有没有更好的方法来排序这些?
答案 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 here,ORDER BY CAST('/' + YourColumn + '/' AS HIERARCHYID)
甚至更好。