PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Query XPath nei dati gerarchici, preservando la relazione antenato-discendente

Prova questo:

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;

Produce esattamente l'output richiesto.

Innanzitutto, nella sottoquery, recupero interi nodi pappagallo. Un nodo per riga.

Successivamente, ottengo il nome e i descrittori con xpath(). Entrambi sono array. Prendo il primo (e unico) elemento di name e dividi il descriptor array con `unnest(), arrivando così al risultato desiderato.

Ho scritto una risposta esauriente a una domanda correlata recentemente. Potrebbe interessarti.