我想从xml中提取标签并插入另一个表中。 这个XML有不同的名称空间,因此我使用local-name()来获取我想要的标签。 但有时会有多个同名的标签。因此它失败了EXACTFETCH返回多个节点。当存在多个标签时,我想考虑两者而不是忽略第二次出现。
source_table(id, payload):
id : 10
payload :
<root>
<name>john</name>
<status>
<statuscode>1</statuscode>
<statusmessage>one</statusmessage>
<statuscode>2</statuscode>
<statusmessage>two</statusmessage>
</status>
</root>
我想提取stauscode和消息并插入另一个表
destination_table(id,name,statuscode,message)
output
10,john,1,one
10,john,2,two
下面是我使用的查询
select id,
extract(payload, '//*[local-name()="name"]'),
extract(payload, '//*[local-name()="statuscode"]'),
extract(payload, '//*[local-name()="statusmessage"]')
from source_table;
我可以通过指定[1]或[2]来获得第一次出现或第二次出现,但我需要两个stauscodes显示如下
10,john,1,one
10,john,2,two
这里的任何帮助
答案 0 :(得分:0)
希望这就是你所需要的:把它放到一个空的查询窗口并执行。根据您的需求进行调整:
此解决方案假定状态代码已排序(如示例1,2,...)。如果这可能以随机顺序发生,请再问一次......
简短说明:CTE&#34; NameAndCode&#34;显示名称和状态代码。 ROW_NUMBER函数为我们提供了节点的索引。我用这个索引来获取正确的消息。
还有一个提示:如果您可以更改XML的格式,最好将消息作为状态代码的归属或将其作为子节点...
<h1><span>OUR ARTICLES</span></h1>