sql >> Database >  >> RDS >> PostgreSQL

Meerdere niveaus van xml-gegevens extraheren met xpath in postgres

Ik begrijp dat deze vraag al een paar jaar oud is, maar ik kwam hier met een soortgelijk probleem en ik geloof dat ik een antwoord heb gevonden.

with x as (select
'<catalog catalog-id="manufacturer-catalog-id">
    <category-assignment category-id="category1" product-id="product1"/>
    <category-assignment category-id="category1" product-id="product2"/>
    <category-assignment category-id="category2" product-id="product3"/>
</catalog>'::xml as t
)
(
select 
       xpath('/catalog/@catalog-id', cat_node) catalog_id,
       xpath('/category-assignment/@category-id', cat_assn_list) category_id,
       xpath('/category-assignment/@product-id', cat_assn_list) product_id         
 from (select unnest(xpath('/catalog/category-assignment', t)) cat_assn_list, t cat_node from x) q
);

Dit geeft

        catalog_id         | category_id | product_id
---------------------------+-------------+------------
 {manufacturer-catalog-id} | {category1} | {product1}
 {manufacturer-catalog-id} | {category1} | {product2}
 {manufacturer-catalog-id} | {category2} | {product3}
(3 rows)

Dit voert in feite de basisselectie uit die twee kolommen retourneert 1) de an xpath om een ​​toewijzingslijst te krijgen (meerdere rijen) en 2) het oorspronkelijke categorieknooppunt. De geretourneerde rijen worden vervolgens bewerkt door de xpath-instructies van een hoger niveau - de categorie-id van de volledige categorieknooppuntkolom en de xpaths op kolomniveau in het toewijzingslijstitem.

Ik geloof dat het probleem van de OP was dat het puur uit de kolom met enkele toewijzingslijst rijden betekent dat, aangezien postgres xml-nodesets op het juiste niveau retourneert, in plaats van verwijzingen naar een enkele dom, de xml-uitvoer die hierdoor wordt geretourneerd onder het catalogusniveau ligt en dat xml ndoset niet naar boven kan worden gepasseerd, b.v. met "voorouder::".

Ik hoop dat dit iemand anders helpt.

Bewerken - ik kan geen commentaar geven op de prestaties hiervan, omdat ik geloof dat de catalogus-id xpath zal worden herhaald voor elke toewijzingsrij binnen hetzelfde catalogusknooppunt.



  1. Hoe kan ik de tabelstructuur in de SQL Server-query weergeven?

  2. NameError:naam '_mysql' is niet gedefinieerd na wijziging in mysql

  3. xpath gebruiken om gegevens uit een XML-kolom in postgres te extraheren

  4. FrankenQueries:wanneer SQL en NoSQL botsen