从SQL查询结果集中的xml列中提取子字符串

时间:2018-08-28 06:31:08

标签: sql xml oracle

我在 Oracle 12数据库中有一个表MYTABLE和列MYXMLMYXML列包含如下所示的长度可变的字符串-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:NodeData xmlns:ns2="http://abcd.org/xyz/schema/">
    <Head msgId="ACVF63980FGQW56123" orgId="12345" ts="2017-04-13T18:37:27+05:30" ver="1.0"/>
    <Info>
        <Identity id="45298" verifiedName="MFROMLA" type="TECH"/>
        <Rating name="HIGH"/>
    </Info>
    <Node Name="PQ" Desc="PreQualified" NodeID="2387ajdh231dqhhg21098"/>
</ns2:NodeData>

我想使用SQL查询从此列值中仅提取PQ。我怎么做?如果可能,我应该可以使用Name标签进行搜索并提取其值。

3 个答案:

答案 0 :(得分:1)

这是一个您可以使用的查询,它从您的xml字符串中提取节点Name的属性Node。假设MYXML数据类型为VARCHAR2

SELECT EXTRACT(xmltype(myxml), '/Node/@Name') 
FROM mytable;

答案 1 :(得分:0)

如果您的列是varchar2,则可以使用字符串方法;例如,有和没有正则表达式的两种方式:

SELECT substr(myXml, 13, instr(myXml, '"', 1, 2) - 13),
       regexp_substr(myXml, '"([^"]+)"', 1, 1, 'i', 1)
FROM mytable

如果您的列是XMLTYPE,则可以使用XML方法:

SELECT EXTRACT(myXml, '/Node/@Name')
from myTable

答案 2 :(得分:0)

这对我有用-

select name from mytable, xmltable(xmlnamespaces ('http://abcd.org/xyz/schema/' as "ns2"),'ns2:NodeData/Node' passing xmltype(myxml) columns name   varchar2(50) path '@Name');