PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Legen Sie Order By fest, um Satzzeichen pro Spalte zu ignorieren

"Normalisieren" zum Sortieren

Sie könnten Verwenden Sie regexp_replace() mit dem Muster '[^a-zA-Z]' im Feld ORDER BY -Klausel, die jedoch nur reine ASCII-Buchstaben erkennt. Verwenden Sie besser die Klassenkürzel '\W' die zusätzliche Nicht-ASCII-Buchstaben in Ihrem Gebietsschema erkennt, wie äüóèß usw.Oder Sie könnten improvisieren und "alle Zeichen mit diakritischen Elementen mit Hilfe des unaccent() auf ihre Grundform normalisieren Funktion. Betrachten Sie diese kleine Demo:

SELECT *
      , regexp_replace(x, '[^a-zA-Z]', '', 'g')
      , regexp_replace(x, '\W', '', 'g')
      , regexp_replace(unaccent(x), '\W', '', 'g')
FROM  (
SELECT 'XY ÖÜÄöüäĆČćč€ĞğīїıŁłŃńŇňŐőōŘřŠšŞşůŽžż‘´’„“”­–—[](),;.:̈� XY'::text AS x) t

->SQLfiddle für Postgres 9.2.
->SQLfiddle für Postgres 9.1.

Der Code für reguläre Ausdrücke wurde in Version 9.2 aktualisiert. Ich vermute dies ist der Grund für die verbesserte Handhabung in 9.2, wo alle Buchstaben im Beispiel gefunden werden, während 9.1 nur einige findet.

unaccent() wird durch das Zusatzmodul unaccent bereitgestellt . Ausführen:

CREATE EXTENSION unaccent;

einmal pro Datenbank zur Verwendung in (Postgres 9.1+, ältere Versionen verwenden einen andere Technik ).

Gebietsschemas / Sortierung

Sie müssen sich darüber im Klaren sein, dass Postgres für Gebietsschemas (einschließlich Sortierung) auf das zugrunde liegende Betriebssystem angewiesen ist. Die Sortierreihenfolge wird von Ihrem gewählten Gebietsschema bestimmt, oder genauer gesagt LC_COLLATE . Mehr in dieser verwandten Antwort:
String-Sortierreihenfolge (LC_COLLATE und LC_CTYPE)

Es gibt Pläne, Sortierungsunterstützung direkt in Postgres zu integrieren , aber das ist derzeit nicht verfügbar.

Viele Gebietsschemata ignorieren die Sonderzeichen, die Sie zum Sortieren von Zeichendaten außerhalb der Box beschreiben. Wenn Sie in Ihrem System ein Gebietsschema installiert haben, das die gesuchte Sortierreihenfolge bereitstellt, können Sie es ad hoc in Postgres 9.1 oder höher verwenden:

SELECT foo FROM bar ORDER BY foo COLLATE "xy_XY"

So sehen Sie, welche Sortierungen in Ihrer aktuellen Postgres-Installation installiert und verfügbar sind:

SELECT * FROM pg_collation;

Leider ist es (noch) nicht möglich, eine eigene benutzerdefinierte Sortierung zu definieren, es sei denn, Sie hacken den Quellcode.

Die Kollatierungsregeln werden normalerweise durch die Regeln einer Sprache geregelt, wie sie in einem Land gesprochen wird. Die Sortierreihenfolge der Telefonbücher wäre, wenn es noch Telefonbücher gäbe ... Ihr Betriebssystem stellt sie zur Verfügung.

Unter Debian Linux können Sie beispielsweise verwenden:

locale -a

um alle generierten Locales anzuzeigen. Und:

dpkg-reconfigure locales

als Root-Benutzer (eine Möglichkeit von mehreren), mehr zu generieren / zu installieren.