concat()
Funkce SQL zřetězí dvě hodnoty, takže je to pouze samostatné připojení středníku ke každé extrahované hodnotě. Ale ve skutečnosti se snažíte provést řetězcovou agregaci výsledků (což by pravděpodobně mohlo být skutečně více než dvě extrahované hodnoty).
Místo extraktu můžete použít XMLQuery a použít XPath string-join()
funkce pro provedení spojení:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Demo s pevnými značkami koncového uzlu 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
Můžete také extrahovat všechny jednotlivé <B>
hodnoty pomocí XMLTable a poté použijte agregaci na úrovni 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ž vám poskytuje větší flexibilitu a umožnilo by snazší seskupování podle hodnot jiných uzlů, ale na základě vaší vzorové hodnoty to zde není potřeba.