Postgresql: Regex anwenden und Array in Datensätze umwandeln

Um ein „ziemlich unkonventionelles“ Language-System aufzulösen, sollte im ersten Schritt ein View auf die vorhandenen Daten erzeugt werden.

Die Tabelle hat ein Index-Feld, dass aus einem umgewandelten PHP-Array entstanden ist (nicht nachmachen – straight out of programmer’s hell!).
Alle Einträge zu einem Segment (zB autopayment) fangen mit diesem an und haben den Schlüssel in eckige Klammern gesetzt (autopayment[btn_search]). Es gilt, für ein Segment alle Schlüssel zu finden (…WHERE id LIKE ‚autopayment[%‘ würde das Segment finden, aber nicht die Schlüssel). „de“ ist das Value-Feld, wo die deutsche Übersetzung drin steht (auch hier gilt: nicht nachmachen 🙂

SELECT id,de,unnest(regexp_matches(id,'^autopayment\[(.*)\]$')) as segment  FROM language order by id asc;

Der Haken in diesem Fall ist, dass es bei mehreren Ergebnissen für den Regex auch mehrere Zeilen gibt.
Wer nicht mehrere Treffer als Ergebnis des Regex möchte (sondern nur einen), der kann auch folgenden Ansatz wählen:

SELECT id,de,array_to_string(regexp_matches(id,'^autopayment\[(.*)\]$'),'') as segment  FROM language order by id asc;

Das zweite Argument bei array_to_string ist das Trennzeichen, denn in diesem Fall würden alle Ergebnisse in einem String zusammengefasst werden.

Liefert dann für oben angegebenes Beispiel:
‚autopayment[btn_search]‘,’Suchen‘,’btn_search‘

Ohne das „unnest()“ wird ein text-Array zurückgeliefert ({btn_search}), was weiter behandelt werden müsste. Sollten mehrere Muster gefunden werden, werden entsprechend auch mehrere Zeilen zurückgegeben.

Postgres ab 9.0 (http://www.postgresql.org/docs/9.0/static/functions-array.html)

Schreibe einen Kommentar