【问题标题】:SQL Order Alphabetically without preceding zeros for numbers less than 10对于小于 10 的数字,SQL 按字母顺序排列,前面没有零
【发布时间】:2010-01-07 05:05:34
【问题描述】:

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

A1
A2
A3
A5
A10
A11
A20
A23
A24

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

A1
A10
A11
A12
A2 A20
A23
A24
A3 A5

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

【问题讨论】:

  • 你的真实邮政编码总是以一个字母开头还是可变的?

标签: mysql alphanumeric


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 效果很好!还涉及其他字母,但我能够使用类似的东西来做到这一点:ORDER BY SUBSTR(letter_portion),SUBSTR(number_portion)。如果邮政编码的位置不一致,那么我很可能会使用 Neil 的回复。谢谢!
    • 强制部分很花哨,没想到。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      排序按字母顺序排列的。

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多