Ordinamento delle colonne Oracle Alpha-Numeric

Aug 19 2020

Sto lavorando per ordinare la colonna Revision di una tabella Oracle DB nell'ordine asc come di seguito. Dapprima le revisioni numeriche da ordinare (1,2,3,…). Successivamente Alfa-Numerico da ordinare come segue: A, B, B1, C, C1, C2,…,Y, Y2, Y3, Z, AA, AB,..,DA, …ZZ, ecc. Row_Number() in l'istruzione SELECT da compilare con 1,2,3... per ogni numero di documento (ABC, XYZ) dopo l'ordinamento delle revisioni.

Vedere l'immagine caricata per la tabella richiesta.

Ho provato con SUBSTR , Ordina per, ecc. ma non sono riuscito a risolvere i requisiti di cui sopra. Qualcuno può aiutarmi su questo? Grazie!

Risposte

1 GMB Aug 19 2020 at 05:00

A quanto ho capito la tua domanda, vuoi inserire le ultime revisioni che contengono solo due caratteri e nessuna cifra.

Puoi usare un ordinamento condizionale:

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

L'espressione regolare descrive una stringa che inizia con un carattere alfanumerico, eventualmente seguito da una cifra: queste revisioni dovrebbero venire prima. Demo su DB Fiddle :

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# | REVISIONE | RN
:--- | :------- | -:
ABC | 1 | 1
ABC | 2 | 2
ABC | 3 | 3
ABC | UN | 4
ABC | B | 5
ABC | B1 | 6
ABC | C | 7
ABC | DO1 | 8
ABC | D | 9
ABC | AA| 10
ABC | AB | 11
ABC | BA | 12
ABC | DA | 13
SayanMalakshinov Aug 19 2020 at 05:18

Esiste un vecchio metodo ben noto: rpad(col, max-length, '0')

Ad esempio rpad(col, max(length(col)) over(), '0'