繁体   English   中英

从SQL的xmltype列中提取具有指定名称的所有标签(也重复)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM