Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menghapuskan Nilai Dipisahkan Koma dalam PostgreSQL dan Mengekalkan Susunan Elemen?

Bagaimana untuk Menghapuskan Nilai Dipisahkan Koma dalam PostgreSQL dan Mengekalkan Susunan Elemen?

Patricia Arquette
Lepaskan: 2025-01-23 04:22:11
asal
806 orang telah melayarinya

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

Peluasan dengan nombor elemen dalam PostgreSQL

Soalan:

Menggunakan fungsi unnest() untuk mengembangkan lajur yang mengandungi nilai dipisahkan koma hanya akan mengembalikan elemen itu sendiri, bukan kedudukan asalnya dalam rentetan.

Sasaran:

Dapatkan elemen dan nombor jujukannya dalam rentetan sumber.

Penyelesaian:

PostgreSQL 14 dan ke atas

Gunakan fungsi string_to_table() dan klausa 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>
Salin selepas log masuk

PostgreSQL 9.4 dan lebih tinggi

Tambah klausa WITH ORDINALITY pada fungsi unnest():

<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>
Salin selepas log masuk

PostgreSQL 8.4 - 9.3

Tinggalkan klausa row_number() dalam fungsi ORDER BY:

<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>
Salin selepas log masuk

PostgreSQL 8.1 - 8.4

Buat fungsi tersuai f_unnest_ord() untuk mengekstrak elemen dan nombor sirinya:

<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>
Salin selepas log masuk

Kemudian gunakan ini untuk mengembangkan nilai dengan nombor ordinal:

<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>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menghapuskan Nilai Dipisahkan Koma dalam PostgreSQL dan Mengekalkan Susunan Elemen?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan