Order-By

如何根據行值的兩個部分對欄位進行排序

  • October 20, 2014

我有一個內容格式為 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

如果您的值真的全部以形式顯示,即兩位數、一個斜線和一位數,這將起作用。如果您有其他格式,則需要更多涉及的解決方案。

引用自:https://dba.stackexchange.com/questions/80617