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
Libérer: 2025-01-23 04:08:10
original
911 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal