我使用订单运行查询,但我的列不是想要的订单
我想要这样:
PROD_1
PROD_2
PROD_3
PROD_4
PROD_5
PROD_6
PROD_7
PROD_8
PROD_9
PROD_10
但它给了我这个
PROD_1
PROD_10
PROD_2
PROD_3
PROD_4
PROD_5
PROD_6
PROD_7
PROD_8
PROD_9
答案 0 :(得分:1)
您需要为每个位置添加0,例如01表示数字1-99或001表示1-999。或者你必须拆分数值并在两个不同的列上排序。
答案 1 :(得分:0)
你试图以词汇方式对某些实际上是部分数字的东西进行排序。你可以在前缀为零(即PROD_000001),但这很脆弱。在实际应用中,我认为Prod 10实际上比Prod 1晚,所以你可以按创建日期时间进行排序。
答案 2 :(得分:0)
SELECT to_number(substr(colname,INSTR(column_name,'_')+1))) prodno, column_name
from table_name
order by prodno
不是很优雅的解决方案,但这应该有效。 (由于我没有访问Oracle,因此可能需要调整函数参数。)首先获取 _ 上的位置,使用该位置使用子字符串获取数字,然后将其转换为数字。如果表大小很大,您可能还需要查看性能
答案 3 :(得分:0)
您需要排序两次(注意我从regexp_replace更改为regexp_substr以允许返回null值)
with
a as (
select 'PROD_1' product from dual union all
select 'PROD_10' product from dual union all
select 'PROD_2' product from dual union all
select 'PROD_3' product from dual union all
select 'PROD_4' product from dual union all
select 'PROD_5' product from dual union all
select 'PROD_6' product from dual union all
select 'PROD_7' product from dual union all
select 'PROD_8' product from dual union all
select 'PROD_9' product from dual union all
select 'DECEAD_1' product from dual union all
select 'DECEAD_10' product from dual union all
select 'DECEAD_2' product from dual union all
select 'DECEAD_20' product from dual union all
select 'TREE_FROG' product from dual
)
select PRODUCT
, regexp_substr(product,'[^[:digit:]]*') --return all non numeric
, regexp_substr(product,'[0-9]+')
from a
order by regexp_substr(product,'[^[:digit:]]*') ,
TO_NUMBER(regexp_substr(product,'[0-9]+')) --note explicit numeric cast
;