PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Consulta XPath em dados hierárquicos, preservando o relacionamento ancestral-descendente


Tente isto:
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;

Produz exatamente a saída solicitada.

Primeiro, na subconsulta, recupero nós de papagaio inteiros. Um nó por linha.

Em seguida, recebo o nome e os descritores com xpath(). Ambos são matrizes. Eu pego o primeiro (e único) elemento de name e divida o descriptor array com `unnest(), chegando assim ao resultado desejado.

Escrevi uma resposta abrangente para uma pergunta relacionada recentemente. Pode ser do seu interesse.