sql >> Database >  >> RDS >> PostgreSQL

XPath-query in hiërarchische gegevens, met behoud van voorouder-nakomelingrelatie

Probeer dit:

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;

Produceert precies de gevraagde output.

Eerst haal ik in de subquery hele papegaai-knooppunten op. Eén knoop per rij.

Vervolgens krijg ik de naam en de descriptors met xpath(). Beide zijn arrays. Ik neem het eerste (en enige) element van name en splits de descriptor array met `unnest(), waardoor het gewenste resultaat wordt bereikt.

Ik schreef een uitgebreid antwoord op een gerelateerde vraag sinds kort. Wellicht interessant voor u.




  1. De invoer uit het HTML-formulier halen en opslaan in mysql via Flask

  2. Korte post over de SQLite UPSERT en de nieuwe RETURNING-clausule.

  3. LISTEN/NOTIFY met pg_notify(text, text) in PostgreSQL

  4. INSERT INTO met SubQuery MySQL