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

Udpakning af flere niveauer af xml-data ved hjælp af xpath i postgres

Jeg sætter pris på, at dette spørgsmål er et par år gammelt, men jeg kom her med et lignende problem og tror, ​​jeg fandt et svar.

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

Dette giver

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

Dette udfører grundlæggende udvælgelsen, som returnerer to kolonner 1) en xpath for at få tildelingsliste (flere rækker) og 2) den oprindelige kategoriknude. De returnerede rækker bearbejdes derefter af xpath-sætningerne på højere niveau - kategori-id'et fra den fulde kategoriknudekolonne og xpaths på kolonneniveauet ind i opgavelisten.

Jeg tror, ​​at OP's problem var, at det at fjerne dette udelukkende fra kolonnen med enkelt tildelingsliste betyder, at eftersom postgres returnerer xml-nodesæt på det passende niveau, snarere end pointere til en enkelt dom, er xml-outputtet, der returneres af dette, under katalogniveauet og at xml ndoeset ikke kan traverseres opad f.eks. med "forfader::".

Håber dette hjælper en anden.

Rediger - jeg kan ikke kommentere på udførelsen af ​​dette, da jeg tror, ​​at catalog-id xpath vil blive gentaget for hver tildelingsrække inden for den samme katalogknude.



  1. Returner flere rækker på en enkelt post

  2. Den returnerede datatype varierer baseret på data i tabellen

  3. Begræns tilslutning til én række

  4. Hvad er bedste praksis for at forhindre SQL-injektion i node-mysql?