如何在 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
【讨论】:
谢谢,很有帮助!所以我可以进一步研究这个话题,以上是关于如何在 Oracle SQL 中的 XML 标记中进行搜索?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Oracle SQLPlus 脚本标记为 JavaScript 中的单个语句
如何在 PL/SQL 中读取 Result 标头 XML 标记