2016-02-09 162 views
3

我有类似下面值的列排序由它后的列名(equipment_no)ASC,想知道如何如图所示的下一个列表它正确排序。如何对MYSQL中的字母数字列进行排序?

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

你在找什么叫做“自然排序” – Uberfuzzy

回答

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

试试这个:

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

,或者你可以尝试使用RIGHT像

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

'CHARINDEX'是'sql-server'函数。 – Wanderer

2

使用substring_index函数来获取从字符串的数量,然后通过将其转换为无符号整数依次是:

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

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

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

有关您的问题的更多细节,也可以找到here

+0

感谢这个想法,下次我实现这样的想法时,我一定会记住这一点 – wishman

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 | 
+---------------+ 
相关问题