PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

XPath-Abfrage in hierarchischen Daten unter Beibehaltung der Vorfahren-Nachkommen-Beziehung

Versuchen Sie Folgendes:

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;

Erzeugt genau die angeforderte Ausgabe.

Zuerst rufe ich in der Unterabfrage ganze Parrot-Knoten ab. Ein Knoten pro Zeile.

Als nächstes bekomme ich den Namen und die Deskriptoren mit xpath(). Beides sind Arrays. Ich nehme das erste (und einzige) Element von name und teilen Sie den descriptor auf array mit `unnest(), wodurch man zum gewünschten Ergebnis kommt.

Ich habe eine umfassende Antwort auf eine verwandte Frage geschrieben in letzter Zeit. Könnte für Sie interessant sein.