concat()
Fungsi SQL menggabungkan dua nilai, jadi itu hanya menambahkan titik koma ke setiap nilai yang diekstraksi secara independen. Tetapi Anda benar-benar mencoba melakukan agregasi string dari hasil (yang mungkin, mungkin, benar-benar lebih dari dua nilai yang diekstraksi).
Anda dapat menggunakan XMLQuery alih-alih mengekstrak, dan menggunakan XPath string-join()
fungsi untuk melakukan penggabungan:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Demo dengan tag simpul akhir XMl tetap:
-- 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
Anda juga dapat mengekstrak semua <B>
individu nilai menggunakan XMLTable, lalu gunakan agregasi tingkat 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
yang memberi Anda lebih banyak fleksibilitas dan memungkinkan pengelompokan berdasarkan nilai simpul lain dengan lebih mudah, tetapi tampaknya hal itu tidak diperlukan di sini berdasarkan nilai contoh Anda.