Maison >base de données >tutoriel mysql >Comment préserver l'ordre des éléments du tableau lors de la jonction de tables PostgreSQL avec des champs de tableau ?

Comment préserver l'ordre des éléments du tableau lors de la jonction de tables PostgreSQL avec des champs de tableau ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-27 07:49:10797parcourir

How to Preserve Array Element Order When Joining PostgreSQL Tables with Array Fields?

Implémentation de PostgreSQL JOIN avec le type de tableau et préservation de l'ordre des éléments du tableau

Problème :
Récupérer les données de la table des éléments, en conservant l'ordre d'éléments dans le champ de type de tableau dans la table some_chosen_data_in_order pour un rangée.

Tentative n° 1 : JOIN

SELECT I.* FROM items AS I
JOIN some_chosen_data_in_order AS S ON I.id = ANY(S.id_items)
WHERE S.id = ?

Tentative n°2 : Sous-requête

SELECT I.* FROM items AS I
WHERE I.id = ANY
(ARRAY[SELECT S.id_items FROM some_chosen_data_in_order WHERE id = ?])

Aucune de ces approches ne préserve l'ordre des éléments dans le array.

Solution :

SELECT t.*
FROM unnest(ARRAY[1,2,3,2,3,5]) item_id
LEFT JOIN items t on t.id=item_id

Cette requête désimbrique le tableau en lignes individuelles, en préservant l'ordre des éléments. Il joint ensuite les éléments résultants à la table des éléments en fonction du champ id.

Exemple :

ID items_data
1 {2,4,233,5}

La requête ci-dessus renverra le résultat suivant :

id data
2 foo
4 bar
233 baz
5 qux

Explication :

La fonction unnest décompresse le tableau dans un tableau avec une ligne par élément. Le LEFT JOIN garantit que tous les éléments du tableau sont renvoyés, y compris ceux qui n'ont pas de lignes correspondantes dans la table des éléments.

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