2015-04-01 55 views
-2

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

我想这个排序表

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-08如何跟在13920-08之前,它应该在它之前。

+0

为什么你将多个单独的值组合成一个字段? – 2015-04-01 20:35:32

+0

你的意思是为什么不把前缀和后缀分开存放?我不知道。我没有设计那张桌子。 – 2015-04-01 20:38:26

回答

1

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

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

你已经为我钉了,Anon。 Muchas gracias。正如你所指出的,我的错误是期望varchars按照整数排序。 – 2015-04-02 15:22:56

-3

REPLICATE(””,X - LEN(域))

其中X是一个所希望的固定长度

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

0

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

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