2012-01-23 132 views
2

我有VARCHAR行的值如:「1,11,2,6,2A,10,6B」 如何選擇它們排序如:1,2,2A,6,6B,10,11 ?mysql varchar排序

嘗試了簡單的SQL查詢,但這沒有奏效。

SELECT * FROM clients ORDER BY id 
+0

怎麼就不行?因爲你發佈的樣本數據,我希望它應該。 (當然,假設'id'是你想要排序的行的名稱。) – bdares

+0

@bdares:nope,它會做'1,10,11,2,2,6,6B' – nico

回答

2

你在找什麼是CAST

CAST(expr AS type) 

您的SQL查詢應該是這樣的:

SELECT * FROM clients ORDER BY CAST(`id` AS DECIMAL), id 
+0

I'確保MySQL可以按照詞法排序,這是他似乎想要的。 – bdares

+0

完全按照我的需要工作:) – Dikobraz

+0

@bdares他也想要十進制排序,如果它只是詞法上的,'1'後面會跟着'11'而不是'2' – technology

3

您可以使用CONVERT

這將首先由數字,然後排序的字母(否則你不能保證有1個,1A,1B等)

SELECT id FROM clients ORDER BY CONVERT(id, UNSIGNED), id 
+0

此外這在MySQL中工作:'SELECT ID FROM clients ORDER BY id * 1,id' –

+0

@Imre L:很酷,我不知道! – nico

2

從以前的答案借款,鑄造或轉換列到ORDER子句中的數字表達式是數字排序字符字段中值的常用解決方案。

部分解決

SELECT * FROM clients ORDER BY CAST(`id` AS DECIMAL) 

但是,這個方案是最常見的對嚴格的數值來實現。由於你的值是一個數字和一個字母的混合體,所以這個解決方案是不夠的。如果您的值前導小數部分相同,例如2,2A2B,則它們可以按任意順序顯示。

完整的解決方案

所以,一旦值數值排序,應進一步與標準(字典)順序進行排序:

SELECT * FROM clients ORDER BY CAST(`id` AS DECIMAL), id