我需要从postgres中的xml列中提取三列数据,以便将xml扩展到它的相应列中。其中一列需要是xml的一个嵌套级别的属性,而其他列是一个级别的嵌套属性。应重复更高级别的数据。这可能吗?有关具体内容,请参阅下面的示例。
谢谢, - sw
考虑以下问题:
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', catalog_xml) catalog_id,
xpath('//@category-id', catalog_xml) category_assignment_category_id,
xpath('//@product-id', catalog_xml) category_assignment_product_id
from (select unnest(xpath('/catalog', t)) catalog_xml from x) q
)
此查询返回此数据:
"{manufacturer-catalog-id}";"{category1,category1,category2}";"{product1,product2,product3}"
此查询:
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', catalog_xml) catalog_id,
xpath('//@category-id', catalog_xml) category_assignment_category_id,
xpath('//@product-id', catalog_xml) category_assignment_product_id
from (select unnest(xpath('/catalog/category-assignment', t)) catalog_xml from x) q
)
--- --- EDITED
返回此数据:
"{}";"{category1}";"{product1}"
"{}";"{category1}";"{product2}"
"{}";"{category2}";"{product3}"
我需要这些数据:
"{manufacturer-catalog-id}";"{category1}";"{product1}"
"{manufacturer-catalog-id}";"{category1}";"{product2}"
"{manufacturer-catalog-id}";"{category2}";"{product3}"
答案 0 :(得分:3)
我认为这个问题已经有几年了,但我带着类似的问题来到这里,相信我找到了答案。
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
);
这给出了
catalog_id | category_id | product_id
---------------------------+-------------+------------
{manufacturer-catalog-id} | {category1} | {product1}
{manufacturer-catalog-id} | {category1} | {product2}
{manufacturer-catalog-id} | {category2} | {product3}
(3 rows)
这基本上执行基本选择,其返回两列1)x路径以获得分配列表(多行)和2)原始类别节点。然后,返回的行由更高级别的xpath语句处理 - 来自完整类别节点列的category-id和列级别xpath进入赋值列表项。
我认为OP的问题在于,纯粹从单一赋值列表列驱动这意味着,因为postgres在适当级别返回xml节点集,而不是指向单个dom的指针,所返回的xml输出这低于目录级别,并且xml ndoeset不能向上遍历,例如与&#34;祖先::&#34;。
希望这有助于某人。
编辑 - 我无法评论其性能,因为我相信将为同一目录节点中的每个分配行重复catalog-id xpath。
答案 1 :(得分:-1)
我认为你将不得不分多个阶段去做。据我所知。然后,您可以在此处提取元素并将它们绑定回父级:
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
), segs_raw as (select unnest(xpath('/catalog', t)) catalog_xml from x),
segs as (select catalog_xml, unnest(xpath('/catalog/@catalog-id', catalog_xml)) catalog_id from segs_raw)
select * from segs;
为了协调事情,我认为下一步是将类别分配XML与目录ID一起拉出来,然后将它们拉出来,这样就可以让你在那里中途。在leach级别,您必须保留要制表的数据,否则您将获得隐式交叉连接。