对包含varchar中的数字的SQL Server列进行排序

时间:2018-03-27 02:47:11

标签: sql sql-server string sorting

我是一个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

3 个答案:

答案 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
相关问题