我是一个SQL Server 2016表,它将以下数据存储在varchar中,如下所示:
1
1-1
1-1-1
1-2
1-1-1-20
1-1-1-5
1-1-2
1-1-1-25
1-15-2
1-1.5
它会将asc排序为默认值:
1
1-1
1-1.5
1-1-1
1-1-1-20
1-1-1-25
1-1-1-5
1-1-2
1-15-2
1-2
但我想在' - '之间对每个数字进行排序。像这样的数字排序
1
1-1
1-1.5
1-1-1
1-1-1-5
1-1-1-20
1-1-1-25
1-1-2
1-2
1-15-2
答案 0 :(得分:1)
根据您的示例,订单依据中的Case语句可以帮助您:
SELECT column1 FROM@TableName
ORDER BY CASE Column1
when '1' then 1
when '1-1' then 2
when '1-1.5' then 3
when '1-1-1' then 4
when '1-1-1-5' then 5
when '1-1-1-20' then 6
when '1-1-1-25' then 7
when '1-1-2' then 8
when '1-2' then 9
when '1-15-2' then 10
else column1 END
答案 1 :(得分:0)
希望这会有所帮助
declare @TableName table(Column1 varchar(10))
insert into @TableName values
('1'),
('1-1'),
('1-1-1'),
('1-2'),
('1-1-1-20'),
('1-1-1-5'),
('1-1-2'),
('1-1-1-25'),
('1-15-2'),
('1-1.5')
DECLARE @delimiter VARCHAR(50) = '-'
;WITH CTE AS
(
SELECT column1,
CAST('<M>' + REPLACE(column1, @delimiter , '</M><M>') + '</M>' AS XML)
AS [Description XML]
FROM @TableName
)
SELECT column1
FROM CTE
Order by [Description XML].value('/M[1]', 'float'), [Description XML].value('/M[2]', 'float'), [Description XML].value('/M[3]', 'float'), [Description XML].value('/M[4]', 'float'),
[Description XML].value('/M[5]', 'float'), [Description XML].value('/M[6]', 'float'), [Description XML].value('/M[7]', 'float'), [Description XML].value('/M[8]', 'float'), [Description XML].value('/M[9]', 'float')
答案 2 :(得分:0)
Please find below answer
**Create table test
(
id varchar(250)
)**
- insert into test values('1')
insert into test values('1-1')
insert into test values('1-1-25')
insert into test values('1-1-5')
insert into test values('1-1-10')
SELECT id FROM test
ORDER BY
CASE WHEN PatIndex('%[-]%',id) > 0
THEN LEFT(id,PatIndex('%[-]%',id)-1)
ELSE id END * 1
,CASE WHEN PatIndex('%[-]%',REVERSE(id)) > 0
THEN RIGHT(id,PatIndex('%[-]%',REVERSE(id))-1)
ELSE NULL END * 1