oracle PL / SQL:排序行

时间:2012-05-29 12:14:20

标签: sql oracle sorting plsql

我使用订单运行查询,但我的列不是想要的订单

我想要这样:

产品

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

4 个答案:

答案 0 :(得分:1)

您需要为每个位置添加0,例如01表示数字1-99或001表示1-999。或者你必须拆分数值并在两个不同的列上排序。

Ask Tom

答案 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
    ;