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

Estrazione di più livelli di dati xml usando xpath in postgres

Apprezzo che questa domanda abbia un paio di anni, ma sono venuto qui con un problema simile e credo di aver trovato una risposta.

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
);

Questo dà

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

Questo fondamentalmente esegue la selezione di base che restituisce due colonne 1) un xpath per ottenere l'elenco di assegnazioni (righe multiple) e 2) il nodo della categoria originale. Le righe restituite vengono quindi elaborate dalle istruzioni xpath di livello superiore:l'id di categoria dalla colonna del nodo di categoria completa e gli xpath a livello di colonna nell'elemento dell'elenco di assegnazione.

Credo che il problema dell'OP fosse che eliminare questo puramente dalla singola colonna dell'elenco di assegnazione significa che, poiché postgres sta restituendo set di nodi xml al livello appropriato, piuttosto che puntatori in un singolo dom, l'output xml restituito da questo è al di sotto del livello del catalogo e che xml ndoeset non può essere spostato verso l'alto, ad es. con "antenato::".

Spero che questo aiuti qualcun altro.

Modifica - Non posso commentare le prestazioni di questo, poiché credo che catalog-id xpath verrà ripetuto per ogni riga di assegnazione all'interno dello stesso nodo del catalogo.