您如何在 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
我正在使用 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