sql >> Databasteknik >  >> RDS >> Oracle

Sammanfoga XMLType-noder i Oracle-fråga

concat() SQL-funktionen sammanfogar två värden, så det är bara att lägga till semikolon till varje extraherat värde oberoende av varandra. Men du försöker verkligen göra strängaggregering av resultaten (som förmodligen kan vara mer än två extraherade värden).

Du kan använda XMLQuery istället för extrahera och använda en XPath string-join() funktion för att göra sammanfogningen:

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

Demo med fasta XMl-ändnodstaggar:

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

Du kan också extrahera alla individuella <B> värden med XMLTable och använd sedan aggregering på SQL-nivå:

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

vilket ger dig mer flexibilitet och skulle tillåta gruppering efter andra nodvärden lättare, men det verkar inte behövas här baserat på ditt exempelvärde.




  1. Django bulk_create med ignorera rader som orsakar IntegrityError?

  2. Lär dig databasdesign med SQL Server Management Studio (SSMS) – Del 2

  3. Mer SQL, mindre kod, med PostgreSQL

  4. ADDM på SearchOracle.com