Oracle Alfa Sayısal sütun sıralaması

Aug 19 2020

Bir Oracle DB tablosunun Revizyon sütununu aşağıdaki gibi artan düzende sıralamak için çalışıyorum. İlk önce sıralanacak sayısal revizyonlar (1,2,3,…). Bundan sonra Alfa-Sayısal aşağıdaki gibi sıralanacaktır: A, B, B1, C, C1, C2,…, Y, Y2, Y3, Z, AA, AB, .., DA,… ZZ, vb. revizyon sıralandıktan sonra her belge numarası (ABC, XYZ) için 1,2,3… ile doldurulacak SELECT ifadesi.

Gerekli tablo için yüklenen resme bakın.

SUBSTR, Order by, vb. İle denedim, ancak yukarıdaki gereksinime göre sıralayamadım. Birisi bana bu konuda yardım edebilir mi? Teşekkürler!

Yanıtlar

1 GMB Aug 19 2020 at 05:00

Sorunuzu anladığım kadarıyla, yalnızca iki karakter içeren ve rakam içermeyen son düzeltmeleri yapmak istiyorsunuz.

Koşullu sıralama kullanabilirsiniz:

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

Normal ifade, alfasayısal bir karakterle başlayan ve isteğe bağlı olarak bir rakamla başlayan bir dizeyi açıklar: bu revizyonlar önce gelmelidir. DB Fiddle Demosu :

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 # | REVİZYON | 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

İyi bilinen eski bir yöntem vardır: rpad (col, max-length, '0')

Örneğin rpad (col, max (length (col)) over (), '0'