2013-04-16 76 views
1

下面的數據是字符串列,按升序排序:自定義排序在mysql中

1/44/104/66 
1/44/104/66/137 
1/44/104/66/138 
1/44/104/66/139 
1/44/104/66/140 
1/44/104/66/141 
1/44/104/66/142 
1/44/104/66/143 
1/44/104/66/67 
1/44/104/66/68 
1/44/104/66/69 

不過,我想這樣的排序是:

1/44/104/66 
1/44/104/66/67 
1/44/104/66/68 
1/44/104/66/69 
1/44/104/66/137 
1/44/104/66/138 
1/44/104/66/139 
1/44/104/66/140 
1/44/104/66/141 
1/44/104/66/142 
1/44/104/66/143 
+0

AFIK這在SQL中是不可能的。 – rekire

+0

你只是按最後一列排序?用簡單的英語,你會如何描述這種類型? –

+0

你可能在這裏找到一些關於將字段作爲整數進行數值排序的答案:http://stackoverflow.com/questions/4686849/sorting-varchar-field-numerically-in-mysql – showdev

回答

0

對於您擁有的數據,這應該工作:

order by length(col), col 

但是,這假定唯一的區別是在最後一列。

+0

如果字符串A大於字符串B(數字),但字符串A比字符串B短*會怎麼樣? PS:我(是)downvoter,但用戶沒有給出足夠的細節,這個答案本身是不正確的。只是想我會指出 –

+0

@Evan。 。 。我的回答清楚地表明,它適用於問題中提供的數據,假設只有最後一個字段發生變化。有什麼關於你不明白的答案嗎? –

0

你可以嘗試沿着線的東西:

select 
    Name 
from TableOne 
ORDER BY Cast(Replace(Name, "/", "") as UNSIGNED) 
0
SELECT * FROM myTable 
ORDER BY CAST(SUBSTRING_INDEX(DATA_COLUMN,"/",-1) AS UNSIGNED) ; 

它是如何工作的:

1:在你原來的順序由順序是不正確的,因爲它是爲lexographically比較字符串,而您想要基於整數值進行排序。

2.在此解決方案中,SUBSTRING_INDEX提取/後的最後一個值,然後將其轉換爲整數以給出所需的順序。

3.您可以擴展相同的解決方案,以便通過數據模式中倒數第二,倒數第三個數字進行排序。

0

不是一個真正的美麗的查詢,但它應該做你需要的東西:

SELECT s 
FROM 
    yourtable 
ORDER BY 
    s + 0, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>0 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 2), '/', -1)+0 
     ELSE 0 END, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>1 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 3), '/', -1)+0 
     ELSE 0 END, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>2 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 4), '/', -1)+0 
     ELSE 0 END, 
    CASE WHEN LENGTH(s)-LENGTH(REPLACE(s, '/',''))>3 
     THEN SUBSTRING_INDEX(SUBSTRING_INDEX(s, '/', 5), '/', -1)+0 
     ELSE 0 END 

請參閱小提琴here