[ORACLE] innerhalb einer Spalte mehrere Sortierungen

crazyPower

Mitglied
Hallo,

ich möchte innerhalb einer Spalte mehrere Sortierkriterien angeben.
in der Spalte stehen folgende Werte:

312AA03
123BG01
BER923
A0344A
02331A

Jetzt sollen zuerst alle Werte kommen, die mit einer Zahl beginnen (die niedrigste zuerst), dann alle die mit einem Buchstaben beginnen (A zuerst). Damit sollte di obige Liste so aussehen:
02331A
123BG01
312AA03
A0344A
BER923

Wenn ich einfach nur ASC sortiere, kommen zuerst alle Buchstaben dann Zahlen. DESC kommen zuerst alle hohen Zahlen, dann von Z aufwärts nach A...

Kann ich das schon per SQL sortiert bekommen, oder muss ich das in meinem Programm erledigen?

cu

cP
 
nein, das geht nicht mit Standard-SQL.

Dazu müsstest du (sofern das möglich ist), bei deinem DBMS die Sortiereinstellungen ändern.

Was du machen willst, geht deshalb nicht, da eine Spalte immer einen atomaren Wert enthält (bzw enthalten soll - der wird dann aber auch als ein solcher interpretiert, wenn du da dein Tagebuch reinschreibst).

Und atomare Werte kannst du eben nicht weiter zerteilen.

gruß shutdown
 
Nun, es gibt schon einen Weg, der zwar nicht sehr flexibel ist, aber die Sortierung immerhin in der Datenbank ermöglicht.

Schreibe dir eine Stored Function, die als Eingabewert dein Feld erwartet und als Rückgabewert einen String liefert. Diese Funktion muss nun einfach deinen übergebenen Wert prüfen und einen "sortierbaren" String zurückliefern.
Bsp: Wenn dein Feld mit einer Zahl beginnt sind die Anfangszeichen des Strings
Ax wobei X die Zahl ist
hat dein Feld ein Buchstabe
Bx, wobei X der entsprechende Buchstabe ist.

In deinem Beispiel also:
mySORT( 02331A ) = A02331A
mySORT( 123BG01 ) = A123BG01
mySORT( 312AA03 ) = A312AA03
mySORT( A0344A ) = B0344A
mySORT( BER923 ) = BER923

Nennen wir die Stored Function mySORT dann könnte der Select
SELECT FELD, mySORT( Feld ) FROM TABLE ORDER BY mySORT( FELD );

Und um das ganze auch performancetechnisch zu optimieren sollte man auf Feld einen FBI (Function Based Index) setzen, also
CREATE INDEX idx_mySORT
ON TABLE ( mySORT( FELD ) )
TABLESPACE INDX;
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück