[英]XPath concat with EXTRACT function Oracle
我想提取“ KEY”和“ VALUE”的值,并使用带有EXTRACT的XPath合并这些结果。
XML示例如下。
<PivotSet>
<item>
<column name = "KEY">RET_1</column>
<column name = "VALUE">A</column>
</item>
<item>
<column name = "KEY">RET_2</column>
<column name = "VALUE">R</column>
</item>
<item>
<column name = "KEY">RET_3</column>
<column name = "VALUE">P</column>
</item>
</PivotSet>
我需要在SQL中返回类似
RET_1@A;RET_2@R;RET_3@P
定界符“ @”分隔键/值,“:”分隔项。 我想用EXTRACT和XPath做到这一点。
您可以将ListAgg与XmlTable一起使用,如下所示:
select LISTAGG(keyItem || '@' || keyValue, ';') WITHIN GROUP (ORDER BY keyItem) AS Concated
from XmlTable( '/PivotSet/item' PASSING XmlType('<PivotSet>
<item>
<column name = "KEY">RET_1</column>
<column name = "VALUE">A</column>
</item>
<item>
<column name = "KEY">RET_2</column>
<column name = "VALUE">R</column>
</item>
<item>
<column name = "KEY">RET_3</column>
<column name = "VALUE">P</column>
</item>
</PivotSet>') COLUMNS keyItem PATH '*:column[@name = "KEY"]',
keyValue PATH '*:column[@name = "VALUE"]');
您可以使用ExtractValue,但是您需要知道XML中有多少//item
元素,然后在extract调用的路径部分中进行指示,但这有点麻烦IMO:
SELECT ExtractValue(xmlOut, '//item[1]/column[@name="KEY"]') || '@' || ExtractValue(xmlOut, '//item[1]/column[@name="VALUE"]') || ';' ||
ExtractValue(xmlOut, '//item[2]/column[@name="KEY"]') || '@' || ExtractValue(xmlOut, '//item[2]/column[@name="VALUE"]') || ';' ||
ExtractValue(xmlOut, '//item[3]/column[@name="KEY"]') || '@' || ExtractValue(xmlOut, '//item[3]/column[@name="VALUE"]') As Concatted
FROM
(
SELECT XmlType('<PivotSet>
<item>
<column name = "KEY">RET_1</column>
<column name = "VALUE">A</column>
</item>
<item>
<column name = "KEY">RET_2</column>
<column name = "VALUE">R</column>
</item>
<item>
<column name = "KEY">RET_3</column>
<column name = "VALUE">P</column>
</item>
</PivotSet>') as xmlOut FROM dual
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.