如何在 Oracle SQL 中的 XML 标记中进行搜索?

Posted

技术标签:

【中文标题】如何在 Oracle SQL 中的 XML 标记中进行搜索?【英文标题】:How do you search within XML tags in Oracle SQL? 【发布时间】: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"。

任何帮助将不胜感激。

【问题讨论】:

【参考方案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 中定义。

以上是关于如何在 Oracle SQL 中的 XML 标记中进行搜索?的主要内容,如果未能解决你的问题,请参考以下文章

从XML到Oracle PL / SQL环境中的路径列表

如何将 Oracle SQLPlus 脚本标记为 JavaScript 中的单个语句

如何在 PL/SQL 中读取 Result 标头 XML 标记

如何将类名或样式名添加到使用 SQL 'FOR XML' 生成的 HTML 标记中

在 Oracle 的 CLOB 列中更新 xml 标记

如何在 Oracle SQL 中搜索特定的 XML 值?