sql >> Databáze >  >> RDS >> Oracle

Spojte uzly XMLType v dotazu Oracle

concat() Funkce SQL zřetězí dvě hodnoty, takže je to pouze samostatné připojení středníku ke každé extrahované hodnotě. Ale ve skutečnosti se snažíte provést řetězcovou agregaci výsledků (což by pravděpodobně mohlo být skutečně více než dvě extrahované hodnoty).

Místo extraktu můžete použít XMLQuery a použít XPath string-join() funkce pro provedení spojení:

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

Demo s pevnými značkami koncového uzlu 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

Můžete také extrahovat všechny jednotlivé <B> hodnoty pomocí XMLTable a poté použijte agregaci na úrovni 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

což vám poskytuje větší flexibilitu a umožnilo by snazší seskupování podle hodnot jiných uzlů, ale na základě vaší vzorové hodnoty to zde není potřeba.




  1. Úlohy hybridní databáze OLTP/Analytics v clusteru Galera využívající asynchronní podřízené jednotky

  2. Jak používat SQL Server HierarchyID prostřednictvím jednoduchých příkladů

  3. Postgres čas s časovou zónou rovnosti

  4. SQL Server:Jaký je rozdíl mezi CROSS JOIN a FULL OUTER JOIN?