按数字排序所选 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)
我有一个 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;
这与
无论前 10 个字符是什么,这都有效:
ORDER BY CONCAT(LEFT(vtest, 10), CASE WHEN LENGTH(vtest) = 12
THEN CONCAT(0,RIGHT(vtest,1))
ELSE RIGHT(vtest,2) END)