Oracle Alpha-Numeric-Spaltensortierung
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
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
Es gibt eine bekannte alte Methode: rpad(col, max-length, '0')
Zum Beispiel rpad(col, max(length(col)) over(), '0'