如果對字元型編號欄位(如1-2)進行排序
來源:互聯網
上載者:User
排序 問題說明:在開發中經常遇到要對“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)