Объединить узлы XMLType в запросе Oracle - PullRequest
1 голос
/ 02 апреля 2019

У меня есть столбец CLOB, который содержит данные типа XML. Например, данные XML:

<A><B>123</b><C>456</C><B>789</b></A>

Я пробовал функцию concat:

concat(xmltype (a.xml).EXTRACT ('//B/text()').getStringVal (),';'))

или

xmltype (a.xml).EXTRACT (concat('//B/text()',';').getStringVal ()))

Но они дают ";" только в конце, а не после каждого тега <B>.

Я сейчас использую

xmltype (a.xml).EXTRACT ('//B/text()').getStringVal () 

Я хочу объединить все <B> с ;, и ожидаемый результат должен быть 123;789

Пожалуйста, предложите мне, как я могу объединить мои данные.

1 Ответ

2 голосов
/ 02 апреля 2019

Функция SQL concat() объединяет два значения, поэтому просто добавляет точку с запятой к каждому извлеченному значению независимо. Но вы действительно пытаетесь выполнить агрегацию строк результатов (которые, возможно, на самом деле могут быть более двух извлеченных значений).

Вы можете использовать XMLQuery вместо извлечения и использовать функцию XPath string-join() для объединения:

XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)

Демонстрация с фиксированными тегами конечных узлов XMl:

-- CTE for sample data
with a (xml) as (
  select '<A><B>123</B><C>456</C><B>789</B></A>' from dual
)
-- actual query
select XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content) as result
from a;

RESULT
------------------------------
123;789

Вы также можете извлечь все отдельные значения <B>, используя XMLTable, а затем использовать агрегацию на уровне SQL:

-- CTE for sample data
with a (xml) as (
  select '<A><B>123</B><C>456</C><B>789</B></A>' from dual
)
-- actual query
select listagg(x.b, ';') within group (order by null) as result
from a
cross join XMLTable('/A/B' passing xmltype(a.xml) columns b number path '.') x;

RESULT
------------------------------
123;789

, который дает вам больше гибкости и позволяет более легко группировать по другим значениям узла, но это, как представляется, не требуется здесь на основе значения вашего примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...