Unerwünschte Sortierung

Hallo allerseits!

Beispiel:
Auszug aus einer Liste österreichischer Ortsnamen
Erzieltes Ergebnis mit ORDER BY:

Salzburg
St. Christophen
Steyr
St. Kanzian
Stockerau
St. Pölten

Gewünschtes Sortierergebnis

Salzburg
St. Christophen
St. Kanzian
St. Pölten
Steyr
Stockerau

Ist es möglich, die Art der Sortierung zu meinen Gunsten zu beeinflussen?

Soweit mir bekannt ist, hat sich in diesem Bereich nichts geändert zwischen PG 8.1 und PG 8.2

Wenn ich es richtig verstanden habe, verwendet PostgreSQL zum Sortieren Betriebssystem-Routinen.
Vor dem Stringvergleich werden offenbar Leerzeichen und Satzzeichen entsorgt. Aber genau das möchte ich hier nicht.

Meine Umgebung:

Linux … 2.6.17-10-386 #2 Tue Dec 5 22:26:18 UTC 2006 i686 GNU/Linux

Shell> env |grep de_
LANG=de_DE.UTF-8
LANGUAGE=de_DE:de:en_GB:en

postgres=# SELECT version();
version

PostgreSQL 8.1.4 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5)
(1 Zeile)

postgres=# SHOW LC_COLLATE;
lc_collate

de_DE.utf8
(1 Zeile)

postgres=# SHOW LC_CTYPE;
lc_ctype

de_DE.utf8
(1 Zeile)

Umlaute werden richtig einsortiert. Die Lokalisierung greift also.

Beste Grüße
Gerald



test=*# select o from orte order by regexp_replace(regexp_replace(o,'.','1'),' ', 2);
        o
-----------------
 Salzburg
 St. Christophen
 St. Kanzian
 St. Pölten
 Steyr
 Stockerau
(6 rows)

test=*#

Ugly, aber tut, was es soll, oder?

Der Trick ist, für die Sortierung den Punkt und das Leerzeichen durch Ziffern zu ersetzen :wink:

Andreas

Der Punkt wäre noch zu maskieren.

Ugly - ja. Aber als Notlösung brauchbar.

Danke!!!
Gerald

Ich verwende jetzt folgende Lösung:

... ORDER BY regexp_replace(o,'[[ :p unct:] ]','0','g')

Interpunktionszeichen und Spaces werden durch die Ziffer Null ersetzt.

Vielleicht nützt es auch anderen.

Nochmals “Danke” für die Anregung
Gerald

Yo, so sieht das natürlich sauberer aus als meine Schnell-Lösung. Danke für das Feedback.


Andreas