Maison > base de données > tutoriel mysql > Comment dissocier les valeurs séparées par des virgules dans PostgreSQL et préserver l'ordre des éléments ?

Comment dissocier les valeurs séparées par des virgules dans PostgreSQL et préserver l'ordre des éléments ?

Patricia Arquette
Libérer: 2025-01-23 04:22:11
original
827 Les gens l'ont consulté

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

Extension avec les numéros d'éléments dans PostgreSQL

Question :

L'utilisation de la fonction unnest() pour développer une colonne contenant des valeurs séparées par des virgules ne renverra que les éléments eux-mêmes, pas leurs positions d'origine dans la chaîne.

Cible :

Récupérez l'élément et son numéro de séquence dans la chaîne source.

Solution :

PostgreSQL 14 et supérieur

Utilisez la fonction string_to_table() et la clause WITH ORDINALITY :

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

PostgreSQL 9.4 et supérieur

Ajouter une clause WITH ORDINALITY à la fonction unnest() :

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

PostgreSQL 8.4 - 9.3

Omettre la clause row_number() dans la fonction ORDER BY :

SELECT *, row_number() OVER (PARTITION by id) AS nr
FROM (SELECT id, regexp_split_to_table(elements, ',') AS elem FROM tbl) t;
Copier après la connexion

PostgreSQL 8.1 - 8.4

Créez une fonction personnalisée f_unnest_ord() pour extraire les éléments et leurs numéros de série :

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

Ensuite, utilisez ceci pour développer les valeurs avec des nombres ordinaux :

SELECT id, arr, (rec).*
FROM (SELECT *, f_unnest_ord(arr) AS rec FROM (VALUES (1, '{a,b,c}'::text[])...) t) sub;
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!

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