使用 XQUERY 节点函数将值提取到行中
Using the XQUERY node function to extract values into rows
我的问题与此 one 相同,但我使用的是 Oracle 12.1 而不是 SQL 服务器。
我想从以下 xml 文档中提取所有名称元素:
<ci5>
<employee>
<name>George Cowley</name>
<salary via="B">80000</salary>
</employee>
<employee>
<name>William Bodie</name>
<salary via="C">40000</salary>
</employee>
<employee>
<name>Ray Doyle</name>
<salary via="C">40000</salary>
</employee>
</ci5>
我想要的输出是三个单独的行,例如:
<name>George Cowley</name>
<name>William Bodie</name>
<name>Ray Doyle</name>
使用以下查询
SELECT XMLQUERY('ci5/employee/name'
PASSING BY VALUE XMLTYPE.CREATEXML('<ci5><employee><name>George Cowley</name><salary via="B">80000</salary></employee><employee><name>William Bodie</name><salary via="C">40000</salary></employee><employee><name>Ray Doyle</name><salary via="C">40000</salary></employee></ci5>') RETURNING CONTENT) x
FROM dual;
SELECT XMLQUERY('for $i in /ci5
return $i/employee/name'
PASSING BY VALUE XMLTYPE.CREATEXML('<ci5><employee><name>George Cowley</name><salary via="B">80000</salary></employee><employee><name>William Bodie</name><salary via="C">40000</salary></employee><employee><name>Ray Doyle</name><salary via="C">40000</salary></employee></ci5>') RETURNING CONTENT) x
FROM dual;
名称已显示,但输出全部在一行中:
<name>George Cowley</name><name>William Bodie</name><name>Ray Doyle</name>
看起来我需要使用 NODE
函数,但我不知道如何在 Oracle 上下文中使用它。
我认为您不需要为此使用任何 xquery。一个简单的 xpath 表达式就足够了。这里有两个选项。第一个 returns 一个 XML 序列(单独的 xml 个节点),第二个 returns 作为 table 行:
WITH test AS
(SELECT xmltype('<ci5>
<employee>
<name>George Cowley</name>
<salary via="B">80000</salary>
</employee>
<employee>
<name>William Bodie</name>
<salary via="C">40000</salary>
</employee>
<employee>
<name>Ray Doyle</name>
<salary via="C">40000</salary>
</employee>
</ci5> ') data
FROM dual
)
SELECT xmlsequence(extract(data,'/ci5/employee/name')) FROM test
WITH test AS
(SELECT xmltype('<ci5>
<employee>
<name>George Cowley</name>
<salary via="B">80000</salary>
</employee>
<employee>
<name>William Bodie</name>
<salary via="C">40000</salary>
</employee>
<employee>
<name>Ray Doyle</name>
<salary via="C">40000</salary>
</employee>
</ci5> ') data
FROM dual
)
SELECT extract(value(d), '*') AS name
FROM test,
TABLE(xmlsequence(extract(data, '/ci5/employee/name'))) d
This Oracle white paper answered the question, I needed to use XMLTABLE 其中
...maps the result of an XQuery evaluation into relational rows and
columns...
更改我的查询以使用 XMLTABLE
SELECT x.ename
FROM XMLTABLE('/ci5/employee/name'
PASSING XMLTYPE.CREATEXML('<ci5><employee><name>George Cowley</name><salary via="B">80000</salary></employee><employee><name>William Bodie</name><salary via="C">40000</salary></employee><employee><name>Ray Doyle</name><salary via="C">40000</salary></employee></ci5>')
COLUMNS ename VARCHAR2(30) PATH '/name') x
在 SQL 开发人员中给出以下输出:
我的问题与此 one 相同,但我使用的是 Oracle 12.1 而不是 SQL 服务器。
我想从以下 xml 文档中提取所有名称元素:
<ci5>
<employee>
<name>George Cowley</name>
<salary via="B">80000</salary>
</employee>
<employee>
<name>William Bodie</name>
<salary via="C">40000</salary>
</employee>
<employee>
<name>Ray Doyle</name>
<salary via="C">40000</salary>
</employee>
</ci5>
我想要的输出是三个单独的行,例如:
<name>George Cowley</name>
<name>William Bodie</name>
<name>Ray Doyle</name>
使用以下查询
SELECT XMLQUERY('ci5/employee/name'
PASSING BY VALUE XMLTYPE.CREATEXML('<ci5><employee><name>George Cowley</name><salary via="B">80000</salary></employee><employee><name>William Bodie</name><salary via="C">40000</salary></employee><employee><name>Ray Doyle</name><salary via="C">40000</salary></employee></ci5>') RETURNING CONTENT) x
FROM dual;
SELECT XMLQUERY('for $i in /ci5
return $i/employee/name'
PASSING BY VALUE XMLTYPE.CREATEXML('<ci5><employee><name>George Cowley</name><salary via="B">80000</salary></employee><employee><name>William Bodie</name><salary via="C">40000</salary></employee><employee><name>Ray Doyle</name><salary via="C">40000</salary></employee></ci5>') RETURNING CONTENT) x
FROM dual;
名称已显示,但输出全部在一行中:
<name>George Cowley</name><name>William Bodie</name><name>Ray Doyle</name>
看起来我需要使用 NODE
函数,但我不知道如何在 Oracle 上下文中使用它。
我认为您不需要为此使用任何 xquery。一个简单的 xpath 表达式就足够了。这里有两个选项。第一个 returns 一个 XML 序列(单独的 xml 个节点),第二个 returns 作为 table 行:
WITH test AS
(SELECT xmltype('<ci5>
<employee>
<name>George Cowley</name>
<salary via="B">80000</salary>
</employee>
<employee>
<name>William Bodie</name>
<salary via="C">40000</salary>
</employee>
<employee>
<name>Ray Doyle</name>
<salary via="C">40000</salary>
</employee>
</ci5> ') data
FROM dual
)
SELECT xmlsequence(extract(data,'/ci5/employee/name')) FROM test
WITH test AS
(SELECT xmltype('<ci5>
<employee>
<name>George Cowley</name>
<salary via="B">80000</salary>
</employee>
<employee>
<name>William Bodie</name>
<salary via="C">40000</salary>
</employee>
<employee>
<name>Ray Doyle</name>
<salary via="C">40000</salary>
</employee>
</ci5> ') data
FROM dual
)
SELECT extract(value(d), '*') AS name
FROM test,
TABLE(xmlsequence(extract(data, '/ci5/employee/name'))) d
This Oracle white paper answered the question, I needed to use XMLTABLE 其中
...maps the result of an XQuery evaluation into relational rows and columns...
更改我的查询以使用 XMLTABLE
SELECT x.ename
FROM XMLTABLE('/ci5/employee/name'
PASSING XMLTYPE.CREATEXML('<ci5><employee><name>George Cowley</name><salary via="B">80000</salary></employee><employee><name>William Bodie</name><salary via="C">40000</salary></employee><employee><name>Ray Doyle</name><salary via="C">40000</salary></employee></ci5>')
COLUMNS ename VARCHAR2(30) PATH '/name') x
在 SQL 开发人员中给出以下输出: