按数字排序所选 SQL 结果

Order Selected SQL result by the Numbers

我有一个 Table,它有一个大小为 255 个字符的 'varchar' 类型的列。示例值如下所示

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

然而,在 Select 中使用 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

如何得到数值末尾按时间顺序排列的结果?

如果它跟在同一个/后面并且列中有2个数字,则可以使用

order by right(vtest,2)
ORDER BY CONVERT( RIGHT( test_column_name,
  LENGTH(test_column_name) - LOCATE('/', REVERSE(test_column_name))
  ), UNSIGNED INTEGER);

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

对于您的特定示例,您可以按长度排序,然后按值排序:

order by length(vtest), vtest

我不知道这是否适用于不在问题中的其他行。

Select最后一个“/”之后的结束部分,再乘以1转换为数字:

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

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

这与的答案基本相同,但它使用隐式转换有几个优点:1)更容易read/write,2)你不需要担心要转换为的类型,3) 如果字符恰好存在于某些值中,它会忽略字符。

无论前 10 个字符是什么,这都有效:

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