【问题标题】:How do you search within XML tags in Oracle SQL?如何在 Oracle SQL 中的 XML 标记中进行搜索?
【发布时间】:2021-10-16 13:21:35
【问题描述】:

我正在使用 SQL Developer (Oracle 11g) 来查询包含 XML 字段的表,该字段具有以下结构:

<Affordability>
<Data>
<Run RunNo="1" ChosenResult="N">
<Field1>xxx</Field1>
<Field2>xxx</Field2>
<Field3>xxx</Field3>
</Run>
<Run RunNo="2" ChosenResult="Y">
<Field1>xxx</Field1>
<Field2>xxx</Field2>
<Field3>xxx</Field3>
</Run>
<Run RunNo="3" ChosenResult="N">
<Field1>xxx</Field1>
<Field2>xxx</Field2>
<Field3>xxx</Field3>
</Run>
</Data>
</Affordability>

我希望能够从作为所选结果 (ChosenResult = "Y") 的运行中检索 Field1、Field2 和 Field3。

到目前为止,我有一个基本的 XMLTABLE 查询:

SELECT xt.*
FROM table t,
          XMLTABLE('/Affordability/Data/Run'
            PASSING t.xml_data
            COLUMNS
              Field1   VARCHAR2(20)  PATH 'Field1'
              Field2   VARCHAR2(20)  PATH 'Field2'
              Field3   VARCHAR2(20)  PATH 'Field3'
            ) xt

但我不知道如何搜索标签以获取 ChosenResult = "Y"。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql xml oracle11g


    【解决方案1】:

    如果要获取属性的值,请使用@

    SELECT xt.*
    FROM   table_name t
           CROSS JOIN
           XMLTABLE(
             '/Affordability/Data/Run'
             PASSING t.xml_data
             COLUMNS
               Field1       VARCHAR2(20)  PATH 'Field1',
               Field2       VARCHAR2(20)  PATH 'Field2',
               Field3       VARCHAR2(20)  PATH 'Field3',
               RunNo        NUMBER(3,0)   PATH '@RunNo',
               ChosenResult CHAR(1)       PATH '@ChosenResult'
           ) xt
    

    其中,对于样本数据:

    CREATE TABLE table_name ( xml_data ) AS
    SELECT XMLTYPE('<Affordability>
    <Data>
    <Run RunNo="1" ChosenResult="N">
    <Field1>xxx</Field1>
    <Field2>xxx</Field2>
    <Field3>xxx</Field3>
    </Run>
    <Run RunNo="2" ChosenResult="Y">
    <Field1>xxx</Field1>
    <Field2>xxx</Field2>
    <Field3>xxx</Field3>
    </Run>
    <Run RunNo="3" ChosenResult="N">
    <Field1>xxx</Field1>
    <Field2>xxx</Field2>
    <Field3>xxx</Field3>
    </Run>
    </Data>
    </Affordability>') FROM DUAL;
    

    输出:

    FIELD1 FIELD2 FIELD3 RUNNO CHOSENRESULT
    xxx xxx xxx 1 N
    xxx xxx xxx 2 Y
    xxx xxx xxx 3 N

    如果您只想要ChosenResult="Y" 行,那么您可以通过添加过滤:

    WHERE xt.chosenresult = 'Y'
    

    到上面的查询,但您可能想在 XPath 中进行:

    SELECT xt.*
    FROM   table_name t
           CROSS JOIN
           XMLTABLE(
             '/Affordability/Data/Run[@ChosenResult="Y"]'
             PASSING t.xml_data
             COLUMNS
               Field1       VARCHAR2(20)  PATH 'Field1',
               Field2       VARCHAR2(20)  PATH 'Field2',
               Field3       VARCHAR2(20)  PATH 'Field3',
               RunNo        NUMBER(3,0)   PATH '@RunNo',
               ChosenResult CHAR(1)       PATH '@ChosenResult'
           ) xt
    

    哪些输出:

    FIELD1 FIELD2 FIELD3 RUNNO CHOSENRESULT
    xxx xxx xxx 2 Y

    db小提琴here

    【讨论】:

    • 谢谢,很有帮助!所以我可以进一步研究这个话题,标签中的蓝色关键词叫什么(即RunNo,ChosenResult)?
    • @jakrooster 正如我在答案中提到的,它们是“属性”。它们在 XML 规范 here 中定义。
    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多