[英]extracting all tags(duplicates also) with specified name from xmltype column in sql
我想从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]来发生第一次或第二次发生,但是我需要两个状态码都显示如下
10,john,1,one
10,john,2,two
这里有什么帮助
希望这就是您所需要的:将其放到一个空的查询窗口中并执行。 根据您的需求进行调整:
此解决方案假定状态代码已排序(如您的示例1,2,...)。 如果这可能以随机顺序发生,请再次询问...
简短说明:CTE“ NameAndCode”显示名称和状态码。 ROW_NUMBER函数为我们提供了节点的索引。 我用来获取正确消息的索引。
还有一个提示:如果您可以更改XML的格式,则最好使消息成为statuscode的属性或将其作为子节点。
DECLARE @xmlColumn XML='<root>
<name>john</name>
<status>
<statuscode>1</statuscode>
<statusmessage>one</statusmessage>
<statuscode>2</statuscode>
<statusmessage>two</statusmessage>
</status>
</root>';
WITH NameAndCode AS
(
SELECT @xmlColumn.value('(/root/name)[1]','varchar(max)') AS Name
,x.y.value('.','int') AS Statuscode
,x.y.query('..') XMLNode
,ROW_NUMBER() OVER(ORDER BY x.y.value('.','int')) AS StatusIndex
FROM @xmlColumn.nodes('/root/status/statuscode') AS x(y)
)
SELECT *
,XMLNode.value('(/status[1]/statusmessage[sql:column("StatusIndex")])[1]','varchar(max)')
FROM NameAndCode
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.