sql >> Base de Datos >  >> RDS >> Oracle

Concatenar nodos XMLType en la consulta de Oracle

El concat() La función SQL concatena dos valores, por lo que solo agrega el punto y coma a cada valor extraído de forma independiente. Pero realmente está tratando de hacer una agregación de cadenas de los resultados (lo que, presumiblemente, podría ser realmente más de dos valores extraídos).

Puede usar XMLQuery en lugar de extraer y usar XPath string-join() función para hacer la concatenación:

XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)

Demostración con etiquetas de nodo final XMl fijas:

-- 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

También puede extraer todos los <B> individuales valores usando XMLTable, y luego use la agregación de nivel 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

lo que le brinda más flexibilidad y permitiría agrupar por otros valores de nodo más fácilmente, pero eso no parece ser necesario aquí según su valor de ejemplo.