sql >> データベース >  >> RDS >> PostgreSQL

postgresでxpathを使用して複数レベルのxmlデータを抽出する

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

    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)
    

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

    OPの問題は、これを純粋に単一の割り当てリスト列から外すということは、postgresが単一のdomへのポインターではなく、適切なレベルでxmlノードセットを返すため、これによって返されるxml出力がカタログレベルを下回り、そのxmlndoesetは上向きにトラバースできません。 「祖先::」を使用します。

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

    編集-同じカタログノード内のすべての割り当て行に対してcatalog-idxpathが繰り返されると思うので、これのパフォーマンスについてコメントすることはできません。



    1. MySQLデータベースをGlassfishクラスパスに接続していないか、クラス名が間違っています

    2. 欠落しているアーカイブログからスタンバイデータベースを回復する方法

    3. MySQLクエリがデータベーステーブルデータの変更に成功したかどうかをテストするにはどうすればよいですか?

    4. PostgreSQLでの並列unnest()とソート順