Column : VARCHAR
我有这样的选择:从表订购VARCHAR和数量
ae
10000
10005
ad
ab
ac
10010
SELECT列,我想订购他们是这样的:(数量排序,然后的Varchar订购)
SELECT列FROM TABLE ORDER BY column
1 - 10000
2 - 10005
3 - 10010
4 - ab
5 - ac
6 - ad
7 - ae
Column : VARCHAR
我有这样的选择:从表订购VARCHAR和数量
ae
10000
10005
ad
ab
ac
10010
SELECT列,我想订购他们是这样的:(数量排序,然后的Varchar订购)
SELECT列FROM TABLE ORDER BY column
1 - 10000
2 - 10005
3 - 10010
4 - ab
5 - ac
6 - ad
7 - ae
由于列是字符列,因此数字将按二进制排序排序。你想他们用数字排序,这意味着你需要2 ORDER BY子句
select column_name
from table
order by case when regexp_like(column_name, '^\d+$') then to_number(column_name) end
, column_name
常规表达是
^
- 锚字符串\d
的开始 - 只匹配数字+
- 锚字符串它提供的结束 - 任意次数
$
匹配前面的表达式强制在将列转换为初始排序的数字之前仅存在数字。 更一般地说,将数字和字符放在同一列中是不明智的,因为您已经发现并且因为它阻止您强制执行该数据类型是正确的。
最后,考虑您是否确实需要排序查询,排序通常仅用于显示目的或将某些业务逻辑应用于排序数据集的“顶部”N个元素。
如果在CASE表达式中求值的第一个'column_name'不是一个数字,那么'CASE'生成的'NULL'将是一个“string”NULL。如果后面有一个“数字”,“CASE”会产生一个数字,运行时会发出错误。您需要将'else cast(null as number)'添加到CASE表达式中以防止出现这种情况。 – mathguy
你能证明@mathguy?我已经测试过这个,甚至用子表达式'(select * from table_name order by column_name desc)'替换'table',以强制你正在谈论的情况。有谓谓推动的小危险,是的,但添加演员阵容并不一定有帮助。 – Ben
嗯...我收回。我只是对它进行了测试,似乎并不像我想的那样。我过去遇到过这个问题,可能是用'UNION',所以我认为这在所有类似情况下都会成为问题。无论如何,您的解决方案按原样运行。 – mathguy
从来没有混合的字母和数字?你想在10之前还是之后2? – jarlh
有一个混合 –
你试过你选择语句吗?你有什么结果? – JSapkota