Lorsque vous travaillez avec des colonnes contenant des valeurs séparées par des virgules dans PostgreSQL, vous pouvez utiliser la fonction unnest()
pour extraire des éléments individuels. Cependant, si vous devez inclure des numéros d’éléments dans votre sortie, vous pouvez envisager quelques approches.
Utilisez la fonction string_to_table()
:
<code class="language-sql">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;</code>
Pour les fonctions qui renvoient une collection, utilisez WITH ORDINALITY
:
<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>
Ou, en fonction du tableau réel :
<code class="language-sql">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;</code>
Remplacer row_number() OVER (PARTITION BY id)
par ORDER BY
:
<code class="language-sql">SELECT id, elem, row_number() OVER (PARTITION by id) AS nr FROM (SELECT id, regexp_split_to_table(elements, ',') AS elem FROM tbl);</code>
Utilisez une fonction pour simuler cette fonctionnalité :
<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'; 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;</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!