对字符分隔的可变长度字符串进行排序

时间:2015-04-01 20:30:29

标签: sql sql-server sorting

如何对可变长度的字符分隔字符串进行排序?

我想对此表进行排序

number   | make
=========|=========
11280-08 | bmw
13920-08 | audi
44630-08 | audi
1741-08  | mercedes
03-05    | audi
40093-08 | audi
332-04   | bmw

这样首先在每个后缀组中提升后缀-00然后加上前缀0000

number   | make
=========|=========
332-04   | bmw
03-05    | audi
1741-08  | mercedes
11280-08 | bmw
13920-08 | audi
40093-08 | audi
44630-08 | audi

我正在运行此查询

select * from mytable
order by right(number,2),number asc

但我得到了这个

number   | make
=========|=========
332-04   | bmw
03-05    | audi
11280-08 | bmw
13920-08 | audi
1741-08  | mercedes
40093-08 | audi
44630-08 | audi

请注意1741-0813920-08之后应该如何跟在{{1}}之前。

3 个答案:

答案 0 :(得分:1)

Varchars将按字母顺序排序:(1,11,2,21,3,...)如果您想要数字顺序,请将前缀转换为整数。

select * from mytable
order by
  right(number,2)
 ,CAST(LEFT(number,LEN(number)-3) AS int)

答案 1 :(得分:0)

将缺少的零添加到较短的数字,以便它们首先出现。这样,在排序时,它们都具有相同的长度。这里我们假设最大数字有8个字符

select * 
from mytable
order by REPLICATE('0', 8 - LEN(number)) + number

答案 2 :(得分:-3)

REPLICATE('',X - Len(Field))

其中X是所需的固定长度

更好的是将 - 转换为。并使其成为十进制数。