2017-06-21 70 views
0

我有一個表格,其中有一個大小爲255字符的'varchar'類型的列。在樣本值這個樣子通過數字訂購選定的SQL結果

Test/16-17/1 
Test/16-17/2 
test/16-17/10 
Test/16-17/11 
Test/16-17/20 
Test/16-17/22 

但是在選擇使用ORDER BY子句的結果是按以下順序

Test/16-17/1 
Test/16-17/10 
Test/16-17/11 
Test/16-17/2 
Test/16-17/20 
Test/16-17/22 

我怎麼在數值的Chronolgical秩序的結果值的結尾?

+0

是否使用的是RDBMS? –

+0

我正在使用MySQL – Raky

回答

0
ORDER BY CONVERT(RIGHT(test_column_name, 
    LENGTH(test_column_name) - LOCATE('/', REVERSE(test_column_name)) 
), UNSIGNED INTEGER); 

OR

ORDER BY CONVERT(substring_index(id, '/', -1), UNSIGNED INTEGER); 
+0

沒有先生,看起來很有前途,但沒有工作。 – Raky

+0

Yes sir,This'ORDER BY CONVERT(substring_index(id,'/',-1),UNSIGNED INTEGER);'在看起來很有前途的時候,他們正在努力工作。這是一個很好的通用代碼。謝謝。 – Raky

1

如果它遵循相同的/,並有在列2個位數,你可以使用

order by right(vtest,2) 
+2

哦請測試 – RiggsFolly

+1

是的,這也是工作 – Raky

0

爲了您的具體的例子,你可以通過訂購長度然後值:

order by length(vtest), vtest 

我不知道這是否適用於不在問題中的其他行。

+0

這是一個很酷的箱子思維。 –

+0

是的這是工作 – Raky

0

選擇後,最後一個「/」結尾的部分,再由1乘以將其轉換爲一個數字:

ORDER BY RIGHT(test_column, LENGTH(test_column) - LOCATE('/', REVERSE(test_column))) * 1; 

OR

ORDER BY substring_index(id, '/', -1) * 1; 

這基本上是一樣的通過Keyur Panchal回答,但它使用隱式轉換有幾個優點:1)更容易讀/寫,2)您不必擔心要轉換的類型,3)它忽略字符,如果它們碰巧存在於某些值。

+0

沒有先生,看起來很有前途,但不工作。 – Raky

+0

它不起作用?你有沒有遇到錯誤,或者它沒有按照你想要的方式排序?這與Keyur Panchal的答案基本相同,除了它使用隱式轉換而不是顯式轉換。你說他的答案有效,所以我的工作也必須以同樣的方式進行。隱式轉換提供了許多優點。 –

+0

如果你更喜歡'substring_index',那麼你也可以像這樣'ORDER BY substring_index(id,'/',-1)* 1;'這樣的隱式轉換來使用它。 –

0

這將工作無論什麼前10個字符:

ORDER BY CONCAT(LEFT(vtest, 10), CASE WHEN LENGTH(vtest) = 12 
             THEN CONCAT(0,RIGHT(vtest,1)) 
             ELSE RIGHT(vtest,2) END)