我如何在 sql 服务器中按数据“01”、“02”、“03”、“1”、“2”、“3”等列排序

How can i order by column with data "01","02","03","1","2","3" and so on in sql server

我有 SQL table 数据如下所示

01  Buy-1
010 Buy-10
011 Buy-11
02  Buy-2
1   Direct-1
10  Direct-10
11  Direct-11
2   Direct-2

我想按这样的数据排序

01  Buy-1
02  Buy-2
010 Buy-10
011 Buy-11    
1   Direct-1
2   Direct-2
10  Direct-10
11  Direct-11

这是一个有趣的问题,我不得不回来寻找这个问题的解决方案,因为多年来已经出现过多次。当您没有前导零时,这是一个相当简单的解决方案,但这是不同的。

这适用于您的示例数据,甚至适用于我尝试过的一些极端情况。排序首先有效地计算前导零的数量并将具有最多前导零的移动到顶部。然后它通过将值转换为 int 来排序。这允许您有超过 1 个前导零,并且它仍然会正确排序。此外,即使您在第一列中有字符数据,它也会起作用。

declare @Something table
(
    SomeValue varchar(10)
    , SomeOtherValue varchar(30)
)

insert @Something
select '01' , 'Buy-1' union all
select '010', 'Buy-10' union all
select '011', 'Buy-11' union all
select '02', 'Buy-2' union all
select '1', 'Direct-1' union all
select '10', 'Direct-10' union all
select '11', 'Direct-11' union all
select '2', 'Direct-2'

select *
from @Something s
order by len(SomeValue) - len(convert(varchar(10), try_convert(int, SomeValue))) desc
    , try_convert(int, SomeValue)

编号:01
_Value: Buy-1

SELECT Id, _Value from tblName order by left(_Value, CHARINDEX('-', _Value)), cast(SUBSTRING(_Value, PATINDEX('%[0-9]%', _Value),len(_Value)) as int)

这需要对字符串进行一些额外的处理以获得正确的排序标准。

假设您的数据与带有连字符后跟数字的示例数据一致,您可以按连字符左侧的数据排序,然后将第一列转换为 int

select id, data
from t
order by Left(data, nullif(CharIndex('-',data),0)-1),
  Try_Cast(id as int)

我会首先根据您的代码排序,其前导零,其次是代码值本身。

select code, description
from MyTable
order by case when left(code,1) = '0' then 0 else 1 end,
         convert(int, code)