【问题标题】:How to sort an alphanumeric column with different lengths in MYSQL?如何在MYSQL中对不同长度的字母数字列进行排序?
【发布时间】:2016-08-14 22:29:29
【问题描述】:

我在 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 - 103
T  - AG - 104
TG - 10
TG - 100
TG - 99

我想要的样子

    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
    TG - 10
    TG - 99
    TG - 100

【问题讨论】:

  • 规范化你的数据。

标签: mysql sorting


【解决方案1】:

您似乎希望将最后一位数字视为数字。诀窍是处理名称中不同数量的连字符。如果只有一个连字符,你可以这样做:

order by substring_index(equipment_no, '-', 1),
         substring_index(equipment_no, '-', -1) + 0

在你的情况下,这可能有效:

order by (case when equipment_no not like '%-%-%' 
               then substring_index(equipment_no, '-', 1)
               else substring_index(equipment_no, '-', 2)
          end),
         substring_index(equipment_no, '-', -1) + 0

这处理 1 或 2 连字符的情况,如您的示例所示。

【讨论】:

    【解决方案2】:

    你可以试试:

    SELECT 
    equipment_no 
    FROM fas_details 
    WHERE equipment_no LIKE 'T%' 
    ORDER BY SUBSTRING_INDEX(equipment_no,SUBSTRING_INDEX(equipment_no ,'-',-1)+0,1), 
                     SUBSTRING_INDEX(equipment_no ,'-',-1)+0;
    

    Demonstration: 您可以在此处查看演示,了解四组不同的输入

    SET @str := 'T  - AG - 100';
    
    SELECT SUBSTRING_INDEX(@str,'-',-1)+0 AS numberPart,
    SUBSTRING_INDEX(@str,SUBSTRING_INDEX(@str,'-',-1)+0,1) AS textPart
    

    输出(双连字符):

    numberPart     textPart
    100            T  - AG - 
    

    输出(单个连字符):

    if equipment_no = 'TG - 100'

    numberPart      textPart
    100                TG - 
    

    注意:无论equipment_no 列中的连字符数如何,它都会起作用。

    【讨论】:

      【解决方案3】:

      您需要使用字符串函数提取要排序的部分。下面的例子就可以了。

      order by trim(SUBSTRING_INDEX(equipment_no, '-', -1))
      

      【讨论】:

        猜你喜欢
        • 2016-05-19
        • 1970-01-01
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-13
        • 2022-11-18
        • 1970-01-01
        相关资源
        最近更新 更多