如果對字元型編號欄位(如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)

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。