concat()
Funkcja SQL łączy dwie wartości, więc po prostu dołącza średnik do każdej wyodrębnionej wartości niezależnie. Ale tak naprawdę próbujesz wykonać agregację ciągów wyników (która prawdopodobnie może być naprawdę więcej niż dwiema wyodrębnionymi wartościami).
Możesz użyć XMLQuery zamiast wyodrębniania i użyć XPath string-join()
funkcja do wykonania konkatentacji:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Demo ze stałymi tagami węzłów końcowych 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
Możesz także wyodrębnić wszystkie indywidualne <B>
wartości przy użyciu XMLTable, a następnie użyj agregacji na poziomie 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
co zapewnia większą elastyczność i umożliwia łatwiejsze grupowanie według innych wartości węzłów, ale wydaje się, że nie jest to tutaj potrzebne na podstawie przykładowej wartości.