1

我使用 order by 运行查询,但我的列不是想要的顺序

我想要这样的:

产品

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

4 回答 4

1

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

问汤姆

于 2012-05-29T12:18:03.053 回答
0

您将需要排序两次(注意我从 regexp_replace 更改为 regexp_substr 以允许空返回值)

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
    ;
于 2012-05-29T12:40:15.343 回答
0

您正在尝试按字典顺序对实际上部分数字的东西进行排序。您可以添加零前缀(即 PROD_000001),但这很脆弱。在实际应用中,我假设 Prod 10 实际上在时间上晚于 Prod 1,因此您将按创建日期时间排序。

于 2012-05-29T12:18:08.677 回答
0
    SELECT to_number(substr(colname,INSTR(column_name,'_')+1))) prodno, column_name 
    from table_name
    order by prodno

不是很优雅的解决方案,但这应该可行。(因为我没有访问 Oracle 的权限,函数的参数可能需要调整。)首先获取_上的位置,使用它使用子字符串获取数字,然后将其转换为数字。如果表大小很大,您可能还需要查看性能

于 2012-05-29T12:27:48.487 回答