问题说明: | 在开发中经常遇到要对“1-2”、“1-15”或“1.2”、“1.15”这样的数据字段进行排序,而这样的字段不能直接通过ORDER BY的方式来排序。 |
|
---|
解决方法: | 通过一个用户函数将此类数据字段变成输出成直接可以排序的的字段: CREATE FUNCTION dbo.GetNumberOrderString ( @NumberString NVARCHAR(200), --待处理字符 @SplitChar NVARCHAR(10) = '-', --分隔符 @Length INT = 2 --每段的字符长度 )RETURNS NVARCHAR(500) AS BEGIN DECLARE @Result NVARCHAR(500) -- 结果 SET @Result = '' DECLARE @F INT -- 第一个分隔字符的位置 WHILE LEN(@NumberString) > 0 BEGIN -- 取出字符串 SET @F = CHARINDEX(@SplitChar, @NumberString) --取第一个分隔串的位置 --PRINT @F DECLARE @V NVARCHAR(100) IF @F = 0 BEGIN SET @V = @NumberString --PRINT @V SET @NumberString = '' --PRINT @NumberString END ELSE BEGIN SET @V = SUBSTRING(@NumberString, 0, @F ) --取第一个分隔串的之前值 --PRINT @V SET @NumberString = SUBSTRING(@NumberString, @F + 1, LEN(@NumberString) - @F) --取第一个分隔串之后的值 --PRINT @NumberString END -- 按长度对齐字符串 -- IF LEN(@V) > @Length RAISERROR('对齐的长度超出范围', 1, 1) IF ISNUMERIC(@V) = 1 SET @V = REPLICATE('0', @Length - LEN(@V)) + @V ELSE SET @V = @V + REPLICATE('0', @Length - LEN(@V)) SET @Result = @Result + @V END RETURN @Result END 使用实例:SELECT * FROM item ORDER BY dbo.GetNumberOrderString(id, '-', 3) |
|
---|
Trackback:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=130533
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理