【问题标题】:How to sort an alphanumeric column in MYSQL?如何在 MYSQL 中对字母数字列进行排序?
【发布时间】:2016-05-19 06:03:28
【问题描述】:

我在 ASC 中按列名 (equipment_no) ordering 后有一列的值如下所示,我想知道如何对其进行排序正确地显示在下一个列表中。

SELECT equipment_no FROM fas_details WHERE equipment_no LIKE 'T%' ORDER BY equipment_no

请告诉我你的建议。谢谢。

mysql如何排序

T  - AG - 01
T  - AG - 02
T  - AG - 07
T  - AG - 08
T  - AG - 09
T  - AG - 10
T  - AG - 100
T  - AG - 101
T  - AG - 102
T  - AG - 103
T  - AG - 104
T  - AG - 11
T  - AG - 12
T  - AG - 13

我想要的样子

    T  - AG - 01
    T  - AG - 02
    T  - AG - 07
    T  - AG - 08
    T  - AG - 09
    T  - AG - 10
    T  - AG - 11
    T  - AG - 12
    T  - AG - 13
    T  - AG - 100
    T  - AG - 101
    T  - AG - 102
    T  - AG - 103
    T  - AG - 104

【问题讨论】:

  • 你正在寻找的是一种叫做“自然排序”的东西

标签: mysql sorting


【解决方案1】:

试试这个:

Order By CAST(SUBSTRING_INDEX(equipment_no,'-',-1) AS UNSIGNED)

或者你可以尝试使用 RIGHT like

CAST(RIGHT(equipment_no, (CHARINDEX('-',REVERSE(equipment_no),0))-1) AS UNSIGNED)

【讨论】:

  • CHARINDEX 是一个sql-server 函数。
【解决方案2】:

使用substring_index函数从字符串中获取数字,然后按顺序将其转换为无符号整数:

 SELECT equipment_no FROM fas_details WHERE equipment_no LIKE 'T%' 
 ORDER BY cast(substring_index(equipment_no,'-',-1) as unsigned)

【讨论】:

    【解决方案3】:

    我认为您希望在考虑设备排序的数字部分的同时按字母升序对设备编号进行排序。

    SELECT equipment_no FROM fas_details WHERE equipment_no LIKE 'T%' ORDER BY substring(equipment_no,1,9), substring(equipment_no,10)*1
    

    我假设 device_no 的前 9 个字符是字母,而其余字符是数字字符。将数字子字符串乘以 1 会将其强制为一个数字。

    【讨论】:

      【解决方案4】:

      我认为这样做的一个好方法是按您的数字标记进行排序。它可以使用SUBSTRING 函数获得(你的结构似乎是固定的)。

      但是,性能不是很好,最好的选择是将该数字实际存储在单独的列中。存储可以直接由您的应用程序或using auto generated columns 完成。

      有关您的问题的更多详细信息也可以找到here

      【讨论】:

      • 谢谢你的想法,下次我实现这样的东西时,我一定会记住这一点
      【解决方案5】:

      由于只是最后一位的区别,我们可以通过

      来实现

      ORDER BY LENGTH(equipment_no), equipment_no;

      这里它将首先按字符串的长度升序排列结果,然后按该字符串。

      查询

      SELECT * FROM fas_details
      ORDER BY LENGTH(equipment_no), equipment_no;
      

      SQL Fiddle Demo

      在您的回答中,结果是按整个字符串排序。因此,当您订购一个字符串时,例如:21010 将首先出现。所以只需先按字符串的长度排序。
      因此您可能需要更改您的 sql 查询,如下所示。

      查询

      SELECT equipment_no 
      FROM fas_details 
      WHERE equipment_no LIKE 'T%' 
      ORDER BY LENGTH(equipment_no), equipment_no;
      

      结果

      +---------------+
      |  equipment_no |
      +---------------+
      | T  - AG - 01  |
      | T  - AG - 02  |
      | T  - AG - 07  |
      | T  - AG - 08  |
      | T  - AG - 09  |
      | T  - AG - 10  |
      | T  - AG - 11  |
      | T  - AG - 12  |
      | T  - AG - 13  |
      | T  - AG - 100 |
      | T  - AG - 101 |
      | T  - AG - 102 |
      | T  - AG - 103 |
      | T  - AG - 104 |
      +---------------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        • 2016-08-13
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        相关资源
        最近更新 更多