【问题标题】:MySQL ORDER_BY partial Integer in StringMySQL ORDER_BY 字符串中的部分整数
【发布时间】:2011-12-31 22:29:14
【问题描述】:

我在 MySQL 数据库中有一系列“编号”的 varchar 字段:

+-----------+
| name      |
+-----------+
|  thing 1  |
|  thing 2  |
|  thing 3  |
|  ...      |
|  thing 10 |
|  thing 11 |
+-----------+

我想按照上面列出的顺序订购它们。然而,一个简单的ORDER_BY table.name 会产生如下内容:

thing 1
thing 10
thing 11
thing 2
thing 3
...

这是有道理的,因为 MySQL 将整个字段视为字符串 (varchar)。但是,我尝试了多种排序方法,包括CAST(name AS DECIMAL) 和name + 0。这将仅按小数部分排序,忽略字符串部分。这些都不起作用,因为我需要按name first 和 then 排序,然后按尾随小数排序。

我尝试了ORDER_BY name, name + 0,但似乎没有任何效果。我如何在该子集中执行ORDER_BY 然后ORDER_BY? (我认为这会起作用)。

【问题讨论】:

  • 在 1 前面放一个 0,所以它在数据中是 01、02、03。如果这不是一个选项,则将左右拆分为单独的字段,如果这不是一个选项,则按顺序将左右部分子串化,然后先按左侧部分,然后按右侧部分(将其转换为 int)

标签: mysql sql-order-by natural-sort


【解决方案1】:

您需要进行两种排序 - 第一种是 name 部分,其次是数字部分,如下所示:

order by left(name,instr(name,' ')),cast(right(name,instr(name,' ')+1) as decimal)

【讨论】:

    【解决方案2】:

    函数SUBSTRING_INDEX可以拆分字符串。

    SELECT SUBSTRING_INDEX(name, ' ', 1) AS a, CAST(SUBSTRING(name, ' ', -1) AS DECIMAL) AS b
    FROM t
    ORDER BY a, b
    

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2016-07-12
      相关资源
      最近更新 更多