concat()
SQL функцията конкатенира две стойности, така че просто добавя точката и запетаята към всяка извлечена стойност независимо. Но вие наистина се опитвате да извършите агрегиране на низове на резултатите (което, вероятно, наистина може да бъде повече от две извлечени стойности).
Можете да използвате 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
което ви дава повече гъвкавост и би позволило по-лесно групиране по други стойности на възли, но това изглежда не е необходимо тук въз основа на примерната ви стойност.