繁体   English   中英

XPath与EXTRACT函数结合使用Oracle

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM