2012-11-14 72 views
0

我有代碼的列表:輸出列表 - MYSQL

1A 
1B 
1C 
2A 
2B 
2C 
..... 
10A 
10B.. 
11A 
11B.. 
... 

但是,當我排序,我得到下面的順序(我已刪除從列表中的一些值,使之更短)

10A 
10A 
10B 
10B 
11A 
11A 
1A 
1A 
1B 
1B 
1C 
2B 
2B 
2B 
2B 
2C 

如何按照正確的順序(asc)按數字值和字母順序排列列表?

+0

看到相關http://stackoverflow.com/a/8557307/908471 –

+0

[MySQL的 'ORDER BY' - 正確排序的字母數字]的可能重複(http://stackoverflow.com/questions/ 8557172/mysql-order-by-sorting-alphanumeric-correctly) – 2012-11-14 18:47:26

回答

0

mysql並不直接支持像這樣的「自然」排序,但是你可以用更復雜的order by子句來僞裝它。但是,由於mysql沒有捕獲正則表達式,可以讓你找到這些字符串中數字/字母分割的位置,所以編寫一個可以適當分割的東西會很難看,所以你可以這樣做:

SELECT ugly_split_function1(yourfield) AS alpha, ugly_splitfunction2(yourfield) AS numeric 
.... 
ORDER BY numeric, alpha 

最好的解決辦法是將該字段拆分爲兩個單獨的字段,以便您可以直接在各個字段上進行排序。

+0

確保你將'numeric'轉換爲一個整數類型,或者它仍然會排序怪異。你也可以只做'SELECT yourfield'並把分割移到'SORT'子句中,這樣你就不必看結果中的醜陋了。 – Sammitch

0

如果你的代碼始終是一個數字,後跟只有1個字母,下面應該工作...

SELECT code FROM table ORDER BY LENGTH(code), code 
+0

請注意,如果您的代碼中的數字之後的字母數量不斷變化,上述內容將會中斷。 –

2

我不知道這是可能做做這樣的事情,但它看起來像它是:

SELECT code 
FROM YourTable 
ORDER BY Convert(code, unsigned), code