2010-01-07 29 views
3

是否有可能以下列方式在MySQL中的字母顺序排列:SQL顺序按字母前没有零的数字小于10

A1
A2
A3
A5
A10
A11
A20
A23
A24

Unfortu最近我订购的订单如下面所示。注意A10之前的任何数字是不是分组在一起的?

A1
A10
A11
A12
A2 < A2
A20
A23
A24
A3 < A3
A5 < A5

注: 这些字母数字串实际上是邮政代码,所以我不能放A01,因为这在技术上不是邮政编码前缀。我还想避免让用户输入其他数据来帮助系统正确排序,因为我的用户不是非常了解网络。而且,这些字母数字字符串将无法以正确的顺序输入到数据库中,因为它们可以随时删除和添加。

+0

做真正的邮政编码,你总是以一个字母开头,或者它是可变的吗? – 2010-01-07 05:50:27

回答

3

如果字符串中的位置是一致的,则可以使用表达式来挑选字符串的数字部分。然后通过给它加零来强制数字字符串的整数值。

... 
ORDER BY SUBSTR(postalcode,2)+0 
+0

这很棒!还有其他字母也涉及到,但我可以使用类似这样的方法:ORDER BY SUBSTR(letter_portion),SUBSTR(number_portion)。如果邮政编码没有一致的定位,那么我很可能会使用尼尔的反应。谢谢! – justinl 2010-01-07 06:04:25

+0

强制部分是光滑的,我不会想到它。 – 2010-01-07 06:29:16

5

创建一个将您的varchar转换为数值的UDF。然后在查询的ORDER BY子句中使用该函数。

基本上,你的函数将为每一行分配一个数值,比如A的ASCII值(或者任何第一个字母)* 100 + varchar其余部分的解析数字。

0

一个解决方案是准确计算出邮政编码的格式,然后将其分解为各个部分。假设它是州,邮编:所以你可以有NC27605。然后,您可以分别保存状态和zip_code,并将邮政编码作为计算值。然后让他们按顺序将意味着排序状态,然后zip_code。

这总是被认为是很好的风格;数据库的重点在于让所有独立的数据位都可以独立访问。

0

订购按字母顺序排列。

但是你想订购它们就好像它们是数字一样。不幸的是,ASC和DESC没有提供很大的灵活性。

的MySQL,新骑士,2000年,一份由保罗·杜波依斯(现在有点过时了)说

在MySQL 3.23.2中,您也可以 指定表达式为排序 列。例如,`ORDER BY RAND()如果此功能仍然可用,你可以找到一个内置函数或强制转换为VARCHAR转换为整数 返回行按随机顺序

,将它有可能ORDER BY那功能?或者,我读得太多了?

嗯,我认为比尔卡尔文表达最好。