Erweiterung mit Elementnummern in PostgreSQL
Frage:
Wenn Sie die Funktion unnest()
verwenden, um eine Spalte mit durch Kommas getrennten Werten zu erweitern, werden nur die Elemente selbst zurückgegeben, nicht ihre ursprünglichen Positionen in der Zeichenfolge.
Ziel:
Rufen Sie das Element und seine Sequenznummer in der Quellzeichenfolge ab.
Lösung:
Verwenden Sie die Funktion string_to_table()
und die Klausel WITH ORDINALITY
:
SELECT t.id, a.elem, a.nr FROM tbl t LEFT JOIN LATERAL string_to_table(t.elements, ',') WITH ORDINALITY AS a(elem, nr) ON true;
WITH ORDINALITY
-Klausel zur unnest()
-Funktion hinzufügen:
SELECT t.id, a.elem, a.nr FROM tbl AS t LEFT JOIN LATERAL unnest(string_to_array(t.elements, ',')) WITH ORDINALITY AS a(elem, nr) ON true;
Lassen Sie die row_number()
-Klausel in der ORDER BY
-Funktion weg:
SELECT *, row_number() OVER (PARTITION by id) AS nr FROM (SELECT id, regexp_split_to_table(elements, ',') AS elem FROM tbl) t;
Erstellen Sie eine benutzerdefinierte Funktion f_unnest_ord()
, um Elemente und ihre Seriennummern zu extrahieren:
CREATE FUNCTION f_unnest_ord(anyarray, OUT val anyelement, OUT ordinality integer) RETURNS SETOF record LANGUAGE sql IMMUTABLE AS 'SELECT [i], i - array_lower(,1) + 1 FROM generate_series(array_lower(,1), array_upper(,1)) i';
Dann verwenden Sie dies, um Werte mit Ordnungszahlen zu erweitern:
SELECT id, arr, (rec).* FROM (SELECT *, f_unnest_ord(arr) AS rec FROM (VALUES (1, '{a,b,c}'::text[])...) t) sub;
Das obige ist der detaillierte Inhalt vonWie entschachtelt man durch Kommas getrennte Werte in PostgreSQL und behält die Elementreihenfolge bei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!