Il concat()
La funzione SQL concatena due valori, quindi aggiunge semplicemente il punto e virgola a ciascun valore estratto in modo indipendente. Ma stai davvero cercando di eseguire l'aggregazione di stringhe dei risultati (che, presumibilmente, potrebbero essere più di due valori estratti).
Puoi usare XMLQuery invece di estrarre e usare un XPath string-join()
funzione per eseguire la concatenazione:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Demo con tag di nodo finale XMl fissi:
-- 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
Puoi anche estrarre tutti i singoli <B>
valori utilizzando XMLTable, quindi utilizzare l'aggregazione a livello 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
che ti dà maggiore flessibilità e consentirebbe il raggruppamento per altri valori di nodo più facilmente, ma non sembra essere necessario qui in base al tuo valore di esempio.