PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Requête XPath dans les données hiérarchiques, en préservant la relation ancêtre-descendant

Essayez ceci :

SELECT (xpath('./@name', parrot.node))[1] AS name
     , unnest(xpath('./descriptor/text()', parrot.node)) AS descriptor
FROM  (             
   SELECT unnest(xpath('./parrot', parrot_xml.document)) AS node
   FROM   parrot_xml
   ) parrot;

Produit exactement la sortie demandée.

Tout d'abord, dans la sous-requête, je récupère des nœuds de perroquet entiers. Un nœud par ligne.

Ensuite, je récupère le nom et les descripteurs avec xpath(). Les deux sont des tableaux. Je prends le premier (et unique) élément de name et divisez le descriptor array avec `unnest(), arrivant ainsi au résultat souhaité.

J'ai écrit une réponse complète à une question connexe récemment. Peut vous intéresser.