Column : VARCHAR
我有这个选择:
SELECT列FROM TABLE
ae
10000
10005
ad
ab
ac
10010
我希望像这样订购它们:(订购的数字然后是Varchar订购的)
SELECT列FROM TABLE ORDER BY列
1 - 10000
2 - 10005
3 - 10010
4 - ab
5 - ac
6 - ad
7 - ae
答案 0 :(得分:2)
因为列是字符列,所以数字将按二进制排序。您想以数字方式对它们进行排序,这意味着您需要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个元素。