OracleAlpha-数値列のソート
Aug 19 2020
以下のように、OracleDBテーブルのリビジョン列を昇順で並べ替える作業を行っています。最初にソートされる数値リビジョン(1、2、3、…)。その後、英数字は次のようにソートされます:A、B、B1、C、C1、C2、…、Y、Y2、Y3、Z、AA、AB、..、DA、…ZZなど。Row_Number()in SELECTステートメントは、リビジョンの並べ替え後に各ドキュメント番号(ABC、XYZ)に対して1,2,3…で埋められます。
必要なテーブルについては、アップロードされた画像を参照してください。
SUBSTR、Order byなどを試してみましたが、上記の要件に従って分類できませんでした。誰かがこれについて私を助けることができますか?ありがとう!

回答
1 GMB Aug 19 2020 at 05:00
私はあなたの質問を理解しているので、あなたは2文字だけを含み、数字を含まない最後のリビジョンを置きたいと思います。
条件付きソートを使用できます。
select
t.*,
row_number() over(
partition by doc#
order by
case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
revision
) rn
from t
order by doc#, rn
正規表現は、英数字で始まり、オプションで数字が続く文字列を記述します。これらのリビジョンが最初に来る必要があります。DBフィドルのデモ:
with t as (
select 'ABC' doc#, '1' revision from dual
union all select 'ABC', '2' from dual
union all select 'ABC', '3' from dual
union all select 'ABC', 'A' from dual
union all select 'ABC', 'B' from dual
union all select 'ABC', 'B1' from dual
union all select 'ABC', 'C' from dual
union all select 'ABC', 'C1' from dual
union all select 'ABC', 'D' from dual
union all select 'ABC', 'AA' from dual
union all select 'ABC', 'AB' from dual
union all select 'ABC', 'BA' from dual
union all select 'ABC', 'DA' from dual
)
select
t.*,
row_number() over(
partition by doc#
order by
case when regexp_like(revision, '^\w\d?$') then 0 else 1 end,
revision
) rn
from t
order by doc#, rn
DOC#| 改訂| RN :--- | :------- | -: ABC | 1 | 1 ABC | 2 | 2 ABC | 3 | 3 ABC | A | 4 ABC | B | 5 ABC | B1 | 6 ABC | C | 7 ABC | C1 | 8 ABC | D | 9 ABC | AA | 10 ABC | AB | 11 ABC | BA | 12 ABC | DA | 13
SayanMalakshinov Aug 19 2020 at 05:18
よく知られている古い方法があります:rpad(col、max-length、 '0')
たとえば、rpad(col、max(length(col))over()、 '0'