1

xml が適切な列に展開されるように、postgres の xml 列から 3 列のデータを抽出する必要があります。これらの列の 1 つは、xml の 1 つのネスト レベルの属性である必要があり、他の列は 1 レベル下のネストの属性です。上位レベルのデータを繰り返す必要があります。これは可能ですか?具体的なものについては、以下の例を参照してください。

ありがとう、 --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
) 

---編集済み---

このデータを返します:

"{}";"{category1}";"{product1}"
"{}";"{category1}";"{product2}"
"{}";"{category2}";"{product3}"

このデータが必要です:

"{manufacturer-catalog-id}";"{category1}";"{product1}"
"{manufacturer-catalog-id}";"{category1}";"{product2}"
"{manufacturer-catalog-id}";"{category2}";"{product3}"
4

2 に答える 2

4

この質問は数年前のものだと思いますが、同様の問題を抱えてここに来て、答えを見つけたと信じています.

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) 割り当てリストを取得するための xpath (複数行) と 2) 元のカテゴリ ノードの 2 つの列を返す基本選択を実行します。返された行は、上位レベルの xpath ステートメント (完全なカテゴリ ノード列からのカテゴリ ID と割り当てリスト アイテムへの列レベルの xpath) によって処理されます。

OPの問題は、これを単一の割り当てリスト列から純粋に追い出すことは、postgresが単一のDOMへのポインターではなく、適切なレベルでxmlノードセットを返すため、これによって返されるxml出力がカタログレベルより下であり、その xml ndoeset は、たとえば "ancestor::" を使用して上方にトラバースすることはできません。

これが誰かに役立つことを願っています。

編集 - 同じカタログ ノード内の割り当て行ごとにカタログ ID xpath が繰り返されると考えているため、このパフォーマンスについてコメントすることはできません。

于 2015-04-23T14:55:07.850 に答える
-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;

物事を調整するための次のステップは、カタログ ID と一緒にカテゴリ割り当て XML を引き出してから、これらを引き出すことだと思います。リーチ レベルでは、集計したいデータを保存する必要があります。そうしないと、暗黙的な相互結合が発生します。

于 2013-11-11T02:57:38.403 に答える