您如何在 Oracle SQL 中的 XML 标签内搜索?

How do you search within XML tags in Oracle SQL?

我正在使用 SQL Developer (Oracle 11g) 查询 table,其中包含具有以下结构的 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>

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

到目前为止,我有一个基本的 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"。

如有任何帮助,我们将不胜感激。

如果你想得到属性的值然后使用@:

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<>fiddle here