如何在MYSQL中对不同长度的字母数字列进行排序?

时间:2016-08-14 13:51:16

标签: mysql sorting

我在排序之后的 ASC 中的列名(设备_no)之后有一个列如下的值,并且想知道如何正确排序,如下一个列表所示。

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

3 个答案:

答案 0 :(得分:2)

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

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个连字符大小写,如您的示例所示。

答案 1 :(得分:1)

你可以尝试:

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列中的连字符数量如何,它都能正常工作。

答案 2 :(得分:0)

您需要使用字符串函数提取要排序的部分。以下示例将执行此操作。

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