【问题标题】:Order a VARCHAR column numerically以数字方式对 VARCHAR 列进行排序
【发布时间】:2014-11-18 05:06:21
【问题描述】:

当前 SQL:SELECT code FROM myTable ORDER BY code ASC

code
---
11
113
12
13A

这是我当前的 MySQL 表顺序。

我希望顺序是 A-Z,1-10,但是在数字上,像这样:

code
---
11
12
13A
113

我一开始无法达到这个效果的原因是因为代码列是varchar而不是int。但是,如示例中所示,某些代码前面有一个字母,因此我无法将其更改为整数。

如何在不更改数据类型的情况下解决此问题?

【问题讨论】:

    标签: mysql sql innodb


    【解决方案1】:

    最简单的方法是使用静默转换。只需添加 0:

    order by code + 0
    

    在实践中,您可能希望:

    order by code + 0, code
    

    【讨论】:

    • 非常感谢。只是出于兴趣,如果一个人想做 1-10 然后 A-Z 具有相同的效果,我该怎么做?
    • 显然(对我来说有点惊讶)这似乎有效,但出于好奇,当 MySQL 进行静默转换时,13A 中的 A 会发生什么情况?如何将其转换为整数?
    • @jskidd3 。 . . MySQL 在算术上下文中进行字符串的静默转换。这意味着它会忽略错误并将字符串转换为第一个非数字字符。
    【解决方案2】:

    这应该可以,首先按数字排序,然后按字母排序(如果数字相同):

    select * from myTable
    order by cast(replace(code,'[0-9]+','') as unsigned), code
    

    看到这个SQL Fiddle

    【讨论】:

    • 我怎样才能改变它以便它订购 1-10 然后 A-Z?
    • @jskidd3 只需添加code 作为第二个排序参数。我已经更新了查询。
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多