Heim >Datenbank >MySQL-Tutorial >Wie entschachtelt man durch Kommas getrennte Werte in PostgreSQL und behält die Elementreihenfolge bei?

Wie entschachtelt man durch Kommas getrennte Werte in PostgreSQL und behält die Elementreihenfolge bei?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-23 04:22:11770Durchsuche

How to Unnest Comma-Separated Values in PostgreSQL and Preserve Element Order?

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:

PostgreSQL 14 und höher

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>

PostgreSQL 9.4 und höher

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>

PostgreSQL 8.4 - 9.3

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>

PostgreSQL 8.1 - 8.4

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn