3

是否可以按以下方式在 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

4 回答 4

5

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

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

于 2010-01-07T05:09:28.067 回答
4

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

...
ORDER BY SUBSTR(postalcode,2)+0
于 2010-01-07T05:33:42.073 回答
0

排序按字母顺序排列的。

但是你想把它们当作数字来排序。不幸的是 ASC 和 DESC 并没有提供太多的灵活性。

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

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

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

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

于 2010-01-07T05:26:13.573 回答
0

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

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

于 2010-01-07T05:11:34.503 回答