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
:
<code class="language-sql">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;</code>
WITH ORDINALITY
-Klausel zur unnest()
-Funktion hinzufügen:
<code class="language-sql">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;</code>
Lassen Sie die row_number()
-Klausel in der ORDER BY
-Funktion weg:
<code class="language-sql">SELECT *, row_number() OVER (PARTITION by id) AS nr FROM (SELECT id, regexp_split_to_table(elements, ',') AS elem FROM tbl) t;</code>
Erstellen Sie eine benutzerdefinierte Funktion f_unnest_ord()
, um Elemente und ihre Seriennummern zu extrahieren:
<code class="language-sql">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';</code>
Dann verwenden Sie dies, um Werte mit Ordnungszahlen zu erweitern:
<code class="language-sql">SELECT id, arr, (rec).* FROM (SELECT *, f_unnest_ord(arr) AS rec FROM (VALUES (1, '{a,b,c}'::text[])...) t) sub;</code>
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!