繁体   English   中英

SQL的字母顺序,对于小于10的数字,不以零开头

[英]SQL Order Alphabetically without preceding zeros for numbers less than 10

是否可以按以下方式在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,因为从技术上讲,这不是邮政编码前缀。 我还想避免让用户输入其他数据来帮助系统正确地对其进行排序,因为我的用户不是很精通网络。 同样,这些字母数字字符串将不能以正确的顺序输入数据库,因为它们可以随时被删除和添加。

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

基本上,您的函数将为每行分配一个数字值,类似于A的ASCII值(或第一个字母)* 100 +其余varchar的解析数字。

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

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

一种解决方案是准确找出邮政编码的格式,然后将其分解成几个部分。 假设它是州,邮政编码:这样您就可以拥有NC27605。 然后,您可以分别保存状态和zip_code,并让邮政编码成为一个计算值。 然后按顺序排列将意味着按状态排序,然后按zip_code排序。

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

该顺序字母顺序的。

但是您想像数字一样订购它们。 不幸的是,ASC和DESC并没有提供太多的灵活性。

Paul DuBois撰写的《 MySQL ,New Riders,2000》一书(现在有点过时了)说

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM