从sql

时间:2015-09-01 07:58:39

标签: sql xml duplicates extraction

我想从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

这里的任何帮助

1 个答案:

答案 0 :(得分:0)

希望这就是你所需要的:把它放到一个空的查询窗口并执行。根据您的需求进行调整:

此解决方案假定状态代码已排序(如示例1,2,...)。如果这可能以随机顺序发生,请再问一次......

简短说明:CTE&#34; NameAndCode&#34;显示名称和状态代码。 ROW_NUMBER函数为我们提供了节点的索引。我用这个索引来获取正确的消息。

还有一个提示:如果您可以更改XML的格式,最好将消息作为状态代码的归属或将其作为子节点...

<h1><span>OUR ARTICLES</span></h1>