Der concat()
Die SQL-Funktion verkettet zwei Werte, also hängt sie einfach das Semikolon unabhängig voneinander an jeden extrahierten Wert an. Aber Sie versuchen wirklich, eine String-Aggregation der Ergebnisse durchzuführen (die vermutlich wirklich mehr als zwei extrahierte Werte sein könnten).
Sie können XMLQuery anstelle von Extract verwenden und einen XPath string-join()
verwenden Funktion für die Verkettung:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Demo mit festen XML-Endknoten-Tags:
-- 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
Sie könnten auch alle einzelnen <B>
extrahieren Werte mithilfe von XMLTable und verwenden Sie dann die Aggregation auf SQL-Ebene:
-- 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
was Ihnen mehr Flexibilität gibt und eine einfachere Gruppierung nach anderen Knotenwerten ermöglichen würde, aber das scheint hier nicht erforderlich zu sein, basierend auf Ihrem Beispielwert.