verzwickte sortierung - Knobelei

Hallo,

ich möchte eine sortierung machen!

Hier ein Skript, dass eine Testtabelle mit ein paar Datensätzen erstellt:

CREATE TABLE "public"."t_test" (
  "ntestkey" INTEGER NOT NULL, 
  "number" NUMERIC(9,2), 
  "string" VARCHAR(20), 
  "date" TIMESTAMP WITHOUT TIME ZONE, 
  PRIMARY KEY("ntestkey")
) WITH OIDS;

INSERT INTO t_test (ntestkey, number, string) 
VALUES (1, 21.00, 'A1');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (2, 21.00, 'A8');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (3, 21.00, 'A5');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (4, 21.00, 'A9');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (5, 21.00, 'A02');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (6, 21.00, 'A10');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (7, 21.00, 'A00010');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (8, 21.00, 'A100');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (9, 21.00, 'A13');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (10, 21.00, 'A12');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (11, 21.00, 'B011');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (12, 21.00, 'B15');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (13, 21.00, 'B10');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (14, 21.00, 'B08');

INSERT INTO t_test (ntestkey, number, string) 
VALUES (15, 21.00, 'B7');

Es geht um die Stringfelder.
Diese haben eine gemeinsame eigenschaft ganz rechts Ziffern, ganz links Buchstaben.

Jetzt hätte ich gerne eine Vorgehensweise, besser noch Abfrage, um diese Felder zu sortieren!
Er müsste zunächst die Buchstaben alphabetisch sortieren. Innerhalb gleicher Buchstaben müßte er sich aber die Zahlen ganz rechts anschauen und diese numerisch sortieren.

Das Resultat des obigen Skriptes müßte sein:

A1, A02, A5, A8, A9, A10, A00010, A12, A13, A100, B7, B08, B10, B011, B15

wobei A10 und A00010 “gleichwertig” sind.

hatte mir folgendes überlegt:
select (reguläre suche 1), (reguläre suche 2 ), * from t_test order by 1,2


reguläre suche 2: suche von rechts ausgehend nach dem ersten zeichen, dass keine ziffer ist. “extrahiere” diese zeichen und gib sie als wert zurück

reguläre siche 1: subtrahiere von dem inhalt der spalte string die zeichen aus “reguläre suche 2” und gebe diesen Rest zurück.

Wie formuliere ich nun diese regulären Ausdrücke, oder gibt es eine ganz andere Möglichkeit???

schönen Tag noch
Ingo



test=*# select * from t_test ;
 ntestkey | number | string | date
----------+--------+--------+------
        1 |  21.00 | A1     |
        2 |  21.00 | A8     |
        3 |  21.00 | A5     |
        4 |  21.00 | A9     |
        5 |  21.00 | A02    |
        6 |  21.00 | A10    |
        7 |  21.00 | A00010 |
        8 |  21.00 | A100   |
        9 |  21.00 | A13    |
       10 |  21.00 | A12    |
       11 |  21.00 | B011   |
       12 |  21.00 | B15    |
       13 |  21.00 | B10    |
       14 |  21.00 | B08    |
       15 |  21.00 | B7     |
(15 rows)

test=*# select * from t_test order by regexp_replace(string, '[^A-Z]','','g'), regexp_replace(regexp_replace(string, '[^0-9]',''),'^0*','')::int;
 ntestkey | number | string | date
----------+--------+--------+------
        1 |  21.00 | A1     |
        5 |  21.00 | A02    |
        3 |  21.00 | A5     |
        2 |  21.00 | A8     |
        4 |  21.00 | A9     |
        6 |  21.00 | A10    |
        7 |  21.00 | A00010 |
       10 |  21.00 | A12    |
        9 |  21.00 | A13    |
        8 |  21.00 | A100   |
       15 |  21.00 | B7     |
       14 |  21.00 | B08    |
       13 |  21.00 | B10    |
       11 |  21.00 | B011   |
       12 |  21.00 | B15    |
(15 rows)

Andreas

Wow…

Danke für die schnelle Hilfe…

Hier ein Bier:

|~|
| D
|_|

Danke :wink:

das regexp_replace für die erste Spalte könnte man sicherlich auch gegen ein Konstrukt mit substring tauschen (die andere wohl auch), wäre u.U. performanter. Das Prinzip sollte aber ersichtlich sein.


Andreas