Äpfel und Birnen korrekt sortieren in einer PostgreSQL-Datenbank

Wie sortiere ich korrekt mit deutschen Umlauten?

Man soll ja keine Äpfel mit Birnen vergleichen, aber sortieren sollte man diese Begriffe schon korrekt.

Das Problem

Angenommen wir haben in einer PostgreSQL-Datenbank eine Tabelle mit dem Namen OBST. Dort befinden sich die folgenden Einträge:

  • Äpfel
  • Birnen
  • Bananen
  • brombeeren
  • Erdbeeren
  • Apfelsinen

Wenn ich nun diese Einträge nach dem Namen sortiert ausgebe, bekomme ich das folgende Ergebnis:


SELECT name FROM obst ORDER BY name;
name
------------
Apfelsinen
Bananen
Birnen
Erdbeeren
brombeeren
Äpfel

Das ist noch nicht das, was wir wollen. Die Äpfel sollten ganz oben erscheinen und die brombeeren zwischen den Bananen und den Erdbeeren.

Die Lösung

In der PostgreSQL-Datenbank existiert hier für das Konzept der Collations.
Wir können damit entweder (1.) bei der Sortierung nach einer Spalte angeben, wie die Zeichen intepretiert werden, oder wir geben dies bereits (2.) bei der Definition der Spalte an.

1. Sortierung mit Angabe einer Collation

Zuerst einmal erstellen wir uns eine Collation, die für die deutsche Sprache eine Sortierung wie in einem Telefonbuch vorgibt.


CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de@collation=phonebook');

Diese können wir nun folgendermaßen verwenden:


SELECT name FROM obst ORDER BY name COLLATE "de-u-co-phonebk-x-icu";
name
------------
Äpfel
Apfelsinen
Bananen
Birnen
brombeeren
Erdbeeren

Das sieht doch schon gut aus.

2. Angabe der Collation bei der Erstellung der Tabelle

Wir können schon bei der Erstellung der Tabelle oder im Nachhinein durch eine Anpassung festlegen, welche Collation verwendet werden soll.


ALTER TABLE obst
  ALTER COLUMN name TYPE VARCHAR(60) COLLATE "de-u-co-phonebk-x-icu";

Nun können wir ohne Angabe der Collation die Datensätze korrekt sortiert ausgeben.


SELECT name FROM obst ORDER BY name;
name
------------
Äpfel
Apfelsinen
Bananen
Birnen
brombeeren
Erdbeeren

Click Here to Leave a Comment Below