2011-11-19 32 views
2

我有一个数据集,像这样:MySQL的顺序STRING为INT和插入

print_id 
-------- 
2b 
1 
2 
4b 
4a 
3 
6 
2a 
5 

打印ID可以是的格式:/([0-9] +)([AE] {1} )?/

我想要的是先订购他们的数量,如果有任何信件。如果没有字母,那么它是该号码中的第一个。所以结果应该是像这样:

print_id 
-------- 
1 
2 
2a 
2b 
3 
4a 
4b 
5 
6 

我试图ORDER BY(print_id + 0),它正确排序的数字,但它只是不相当做的伎俩。有什么建议么?

回答

3

你可以有ORDER BY子句中的多个表达式:

ORDER BY print_id + 0, print_id 

这将首先尝试将其数值排序(丢弃字母后缀),如果它们在数值相同,那么将通过其字符串命令他们值(包括字母后缀)。对于你所描述的规则,唯一的一次会中断,如果你有前导零;例如,此ORDER BY子句将对'01b'进行排序,高于'1a'。这可能发生在您的数据?

+0

没有,前导零不会在我的数据会发生。因此,您的解决方案是完美的。非常感谢你。 – voldomazta

+0

不适用于postgresql – Andreas

+0

@Andreas:该问题指定MySQL。 – ruakh

0
ORDER BY print_id 

应该做你想做的。它将按字符字段print_id排序,这相当于按单个字符排序。

所以,为表

print_id 
-------- 
1 
3a 
3c 
2b 
2c 
2a 
3b 
0 
0b 
00 

你会得到

print_id 
-------- 
0 
00 
0b 
1 
2a 
2b 
2c 
3a 
3b 
3c