2017-06-21 72 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)