如何在MYSQL中对字母数字列进行排序?

时间:2016-02-09 09:57:12

标签: mysql sorting

我在排序之后的 ASC 中的列名(equipment_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 - 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

5 个答案:

答案 0 :(得分:3)

试试这个:

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

或者您可以尝试使用RIGHT,如

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我认为你想在按设备排序的数字部分考虑时按升序字母顺序对equipment_no进行排序。

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

来实现

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 |
+---------------+