Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verketten Sie XMLType-Knoten in einer Oracle-Abfrage

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.