Order-By
如何根據行值的兩個部分對欄位進行排序
我有一個內容格式為 22/4、30/8、30/5、30/3 的欄位
我希望它以 22/4、30/3、30/5、30/8 的形式訂購
如果 / 之前的部分相同,則 / 之後的部分訂購!
請幫忙!!
訂購此類字元串的一種方法是
Step1:創建拆分函式
CREATE FUNCTION [dbo].[fnSplit] ( @List VARCHAR(8000), @Delimiter CHAR(1) = ',' ) RETURNS @Temp1 TABLE ( ItemId INT IDENTITY(1, 1) NOT NULL PRIMARY KEY, Item VARCHAR(8000) NULL ) AS BEGIN DECLARE @item VARCHAR(4000), @iPos INT SET @Delimiter = ISNULL(@Delimiter, ',') SET @List = RTRIM(LTRIM(@List)) -- check for final delimiter IF RIGHT(@List, 1) <> @Delimiter -- append final delimiter SELECT @List = @List + @Delimiter -- get position of first element SELECT @iPos = CHARINDEX(@Delimiter, @List, 1) WHILE @iPos > 0 BEGIN -- get item SELECT @item = LTRIM(RTRIM(SUBSTRING(@List, 1, @iPos - 1))) IF @@ERROR <> 0 BREAK -- remove item form list SELECT @List = SUBSTRING(@List, @iPos + 1, LEN(@List) - @iPos + 1) IF @@ERROR <> 0 BREAK -- insert item INSERT @Temp1 VALUES ( @item ) IF @@ERROR <> 0 BREAK -- get position pf next item SELECT @iPos = CHARINDEX(@Delimiter, @List, 1) IF @@ERROR <> 0 BREAK END RETURN END GO
Step2:將字元串拆分為標記
create table #string ( field varchar(500) ) insert into #string select '22/4, 30/3, 30/5, 30/8,40/9,40/3' ----------------Order by string Tokens returned by function select * from #string cross apply dbo.[fnSplit](field,',') atn order by ltrim(rtrim(atn.Item )) drop table #string
如果您只是將包含這些值的列包含在一個
order by
子句中,它們將按照您想要的順序出現。例如select ThisColumn from MyTable order by ThisColumn
如果您的值真的全部以形式顯示,即兩位數、一個斜線和一位數,這將起作用。如果您有其他格式,則需要更多涉及的解決方案。