Oracle Alpha-Numeric-Spaltensortierung

Aug 19 2020

Ich arbeite daran, die Revisionsspalte einer Oracle-DB-Tabelle in der aufsteigenden Reihenfolge wie unten zu sortieren. Zuerst werden die numerischen Revisionen sortiert (1,2,3,…). Danach alphanumerisch wie folgt sortieren: A, B, B1, C, C1, C2,…,Y, Y2, Y3, Z, AA, AB,..,DA, …ZZ, etc. Row_Number() in die SELECT-Anweisung ist mit 1,2,3… für jede Dokumentnummer (ABC, XYZ) nach der Revisionsaussortierung zu füllen.

Siehe das hochgeladene Bild für die erforderliche Tabelle.

Ich habe es mit SUBSTR , Order by usw. versucht, konnte aber nicht gemäß der obigen Anforderung sortieren. Kann mir jemand dabei helfen? Vielen Dank!

Antworten

1 GMB Aug 19 2020 at 05:00

Wie ich Ihre Frage verstehe, möchten Sie letzte Revisionen einfügen, die nur zwei Zeichen und keine Ziffern enthalten.

Sie können eine bedingte Sortierung verwenden:

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

Der reguläre Ausdruck beschreibt eine Zeichenfolge, die mit einem alphanumerischen Zeichen beginnt, optional gefolgt von einer Ziffer: Diese Revisionen sollten zuerst kommen. Demo auf 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# | ÜBERARBEITUNG | RN
:--- | :------- | -:
ABC | 1 | 1
ABC | 2 | 2
ABC | 3 | 3
ABC | Ein | 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

Es gibt eine bekannte alte Methode: rpad(col, max-length, '0')

Zum Beispiel rpad(col, max(length(col)) over(), '0'