concat()
SQL関数は2つの値を連結するため、抽出された各値に個別にセミコロンを追加するだけです。しかし、あなたは実際に結果の文字列集約を行おうとしています(おそらく、実際には2つ以上の抽出された値である可能性があります)。
抽出の代わりにXMLQueryを使用し、XPath string-join()
を使用できます。 連結を行う関数:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
固定された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
個々の<B>
をすべて抽出することもできます XMLTableを使用して値を取得し、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
これにより、柔軟性が高まり、他のノード値によるグループ化が容易になりますが、例の値に基づくと、ここでは必要ないようです。