如何在SQL Server 2019(v15)中仅解析XML中的最新条目(基于索引属性)



我正在处理具有以下结构的XML文件。我想选择d5p1:id="0"的条目中的最新条目(这是其中d5p1:index="0"(;W45A";或者d5p1∶id="0";W450〃;,同时忽略任何较旧的条目。

我想要的输出应该是这样的。请注意,理想情况下,我也会将W45025包含为null,尽管它根本没有包含在最新的条目中:

W45A02W45A08W45001W45022W45023W45024W45025空
Id Term
W45A01 20211221

我想您可以使用XPath来筛选特定的<d5p1:group>节点及其子节点。简化的XPath是:

//d5p1:group[@d5p1:id="W45A" or @d5p1:id="W450"][@d5p1:index="0"]/d5p1:term

简化查询:

SELECT term.value('@d5p1:id', 'varchar(100)') AS id, term.value('.', 'varchar(100)') AS term
FROM ... AS t(doc)
CROSS APPLY doc.nodes('//d5p1:group[@d5p1:id="W45A" or @d5p1:id="W450"][@d5p1:index="0"]/d5p1:term') x(term)

DB<gt;Fiddle

您可以根据特定节点的位置(即node.[1](或其属性值引用特定节点,如下代码所示:

declare @xml xml = '...'
;WITH XMLNAMESPACES('http://www.uc.se/schemas/ucOrderReply/' AS ns,'http://www.uc.se/schemas/ucOrderReply/' AS d5p1)
SELECT 
X.g.value('(@d5p1:id)','varchar(20)')  AS id
,X.g.value('(text())[1]','varchar(20)') AS term

FROM @xml.nodes('UcSwedishIndividualReport/Content/ns:ucReport/ns:xmlReply/ns:reports/ns:report/ns:group[@d5p1:index="0" and (@d5p1:id="W45A" or @d5p1:id="W450")]') G(n)
CROSS APPLY G.n.nodes('ns:term') X(g)

如果您希望在结果集中包含id:W45025,那么它应该以xml形式显示为空节点。另一种方法是将上述查询的结果连接到具有所需id的完整列表的表中。

相关内容

最新更新