Apabila bekerja dengan lajur yang mengandungi nilai dipisahkan koma dalam PostgreSQL, anda boleh menggunakan fungsi unnest()
untuk mengekstrak elemen individu. Walau bagaimanapun, jika anda perlu memasukkan nombor elemen dalam output anda, terdapat beberapa pendekatan yang boleh anda pertimbangkan.
Gunakan fungsi string_to_table()
:
SELECT t.id, a.elem, a.nr FROM tbl AS t LEFT JOIN LATERAL string_to_table(t.elements, ',') WITH ORDINALITY AS a(elem, nr) ON true;
Untuk fungsi yang mengembalikan koleksi, gunakan WITH ORDINALITY
:
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;
Atau, berdasarkan tatasusunan sebenar:
SELECT t.id, a.elem, a.nr FROM tbl AS t LEFT JOIN LATERAL unnest(t.arr) WITH ORDINALITY AS a(elem, nr) ON true;
Gantikan row_number() OVER (PARTITION BY id)
dengan ORDER BY
:
SELECT id, elem, row_number() OVER (PARTITION by id) AS nr FROM (SELECT id, regexp_split_to_table(elements, ',') AS elem FROM tbl);
Gunakan fungsi untuk mensimulasikan fungsi ini:
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'; SELECT id, arr, (rec).* FROM ( SELECT *, f_unnest_ord(arr) AS rec FROM ( VALUES (1, '{a,b,c}'::text[]) -- short for: '[1:3]={a,b,c}' , (2, '[5:7]={a,b,c}') , (3, '[-9:-7]={a,b,c}') ) t(id, arr) ) sub;
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Nombor Elemen Apabila Menyalahkan Nilai Dipisahkan Koma dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!