Angesichts der Zeichenfolge:
"Ich denke, dass PostgreSQL geschickt ist"
Ich würde gerne die einzelnen Wörter in dieser Zeichenfolge bearbeiten. Im Wesentlichen habe ich einen separaten Eintrag, aus dem ich Wortdetails abrufen kann, und möchte ein nicht verschachteltes Array dieser Zeichenfolge in diesem Wörterbuch zusammenfügen.
Bisher habe ich:
select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;
Dies erfüllt die Grundlagen dessen, was ich mir erhofft hatte, aber es bewahrt nicht die ursprüngliche Wortreihenfolge.
Verwandte Frage:
PostgreSQL unnest () mit Elementnummer
postgresql
sorting
array
parse
Swasheck
quelle
quelle
Antworten:
WITH ORDINALITY
in Postgres 9.4 oder späterDas neue Feature vereinfacht diese Art von Problemen. Die obige Abfrage kann nun einfach sein:
Oder auf eine Tabelle angewendet:
Einzelheiten:
Über die implizite
LATERAL
Verknüpfung:Postgres 9.3 oder älter - und allgemeinere Erklärung
Für eine einzelne Zeichenfolge
Sie können die Fensterfunktion anwenden
row_number()
, um die Reihenfolge der Elemente zu speichern. Mit dem üblichenrow_number() OVER (ORDER BY col)
Verfahren erhalten Sie jedoch Zahlen in der Reihenfolge der Sortierung , nicht die ursprüngliche Position in der Zeichenfolge.Sie könnten versuchen, einfach das wegzulassen
ORDER BY
, um die Position "wie sie ist" zu erhalten:Leistung
regexp_split_to_table()
degradiert mit langen Strings.unnest(string_to_array(...))
skaliert besser:Während dies normalerweise funktioniert und ich noch nie bei einfachen Abfragen einen Bruch gesehen habe, behauptet PostgreSQL nichts in Bezug auf die Reihenfolge der Zeilen ohne einen expliziten
ORDER BY
.Um die Ordnungszahl der Elemente in der Originalzeichenfolge zu gewährleisten , verwenden Sie
generate_subscript()
(verbessert mit dem Kommentar von @deszo):Für eine Streichertabelle
In
PARTITION BY id
auf dieOVER
Klausel ...Demo-Tabelle:
Ich benutze
ctid
als Ad-hoc-Ersatz für einen Primärschlüssel . Wenn Sie eine (oder eine eindeutige) Spalte haben, verwenden Sie diese stattdessen.Dies funktioniert ohne eindeutige ID:
SQL-Geige.
Antwort auf Frage
quelle
SELECT generate_series(1,array_length(word_array,1)), unnest(word_array) FROM ....
. 9.3LATERAL
bietet möglicherweise bessere Lösungen für dieses Problem.generate_subscripts(arr, 1)
funktionierengenerate_series(1, array_upper(arr, 1))
? Ich würde das erstere aus Gründen der Klarheit vorziehen.