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

1 ~ 99 の場合は 01、1 ~ 999 の場合は 001 など、各位置に 0 を追加する必要があります。または、数値を分割して、2 つの異なる列で並べ替える必要があります。

トムに聞く

于 2012-05-29T12:18:03.053 に答える
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 に答える
0

2回ソートする必要があります(nullの戻り値を許可するために、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 に答える