SQL顺序按字母顺序不带前面的零,小于10的数字

时间:2010-01-07 05:05:35

标签: mysql alphanumeric

是否可以按以下方式在mySQL中按字母顺序排序:

A1
A2
A3
A5
A10
A11
A20
A23
A24

不幸的是,我订购的订单如下所示。请注意A10之前的任何数字是如何组合在一起的?

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

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

如果字符串中的字符串位于一致位置,则可以使用表达式选择字符串的数字部分。然后通过向其添加零来强制数字字符串为其整数值。

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

答案 2 :(得分:0)

一个解决方案是确切地弄清楚邮政编码的格式是什么,然后将其分解为部分。让我们说它是州,邮政编码:所以你可以拥有NC27605。然后你可以分别保存state和zip_code,并将邮政编码作为计算值。然后按顺序获取它们意味着按状态排序然后zip_code。

这一直被认为是好的风格;数据库的要点是可以独立访问所有独立的数据位。

答案 3 :(得分:0)

排序 按字母顺序排列。

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

我的副本 MySQL ,New Riders,2000,作者Paul DuBois(现在有些过时了)说

  

从MySQL 3.23.2开始,您也可以   将表达式指定为排序   柱。例如,`ORDER BY RAND()   以随机顺序返回行

如果此功能仍然可用,并且您可以找到内置函数或强制转换以将varchar转换为整数,那么ORDER BY该功能是否可行?或者,我读得太多了吗?

嗯,我认为Bill Karwin表达得最好。