【问题标题】:Sort SQL Server column that contains number in the varchar对 varchar 中包含数字的 SQL Server 列进行排序
【发布时间】:2018-09-05 07:33:44
【问题描述】:

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

【问题讨论】:

  • 您的数字中最多可以有多少个分隔符?
  • 相应地在order by 构建您的逻辑
  • @GauravS 不确定,可能是 0 到 9 或更多

标签: sql sql-server string sorting


【解决方案1】:

希望这会有所帮助

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】:

根据您的示例,Order By 中的 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

【讨论】:

  • 有问题的数据可能只是例如......我认为答案必须是通用的。
  • @Raska 是的,这个答案只针对这个例子,我想要通用的排序逻辑。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多