Maison >base de données >tutoriel mysql >Comment obtenir les numéros d'éléments lors de l'annulation de valeurs séparées par des virgules dans PostgreSQL ?

Comment obtenir les numéros d'éléments lors de l'annulation de valeurs séparées par des virgules dans PostgreSQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-23 04:08:10931parcourir

How to Get Element Numbers When UNNESTing Comma-Separated Values in PostgreSQL?

Utilisez la fonction UNNEST() dans PostgreSQL et obtenez le numéro de l'élément

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.

PostgreSQL 14 et supérieur

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>

PostgreSQL 9.4 et supérieur

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>

Versions PostgreSQL 8.4 - 9.3

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>

Versions PostgreSQL 8.1 - 8.4

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn