Мне нужно извлечь три столбца данных из столбца xml в postgres, чтобы xml был расширен в соответствующие столбцы. Один из этих столбцов должен быть атрибутом одного уровня вложенности xml, а остальные столбцы - атрибуты гнезда на один уровень вниз. Данные с более высокого уровня должны быть повторены. Это возможно? См. Пример ниже для чего-то конкретного.Извлечение нескольких уровней данных xml с использованием xpath в postgres
Спасибо, --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}"
Если вам не нужен какой-либо результат, вам не нужно отправлять запрос. Наверное, ты забыл включить что-то в свой вопрос? :) –
Хм, извините. Я починил это. –