【问题标题】:xquery compare 2 xml column for same element namexquery比较相同元素名称的2个xml列
【发布时间】:2019-01-14 22:30:49
【问题描述】:

我的 SQL Server 数据库中有 2 个 xml 列,它们的结构相同但数据不同。

像这样:

第一列 - <root><Person>1</Person><Person>3</Person><Person>6</Person></root>

第二列 - <root><Person>2</Person><Person>3</Person><Person>6</Person></root>

如果这两列之间有任何内部文本值是共同的,我需要按节点名称进行比较。对于上面的例子,它应该返回 true,因为 person 节点共有 3 和 6。

我尝试使用 xquery。我可以将节点与特定值进行比较,但不能与另一列进行比较:

select *
from t
where data.Person.exist('/Person[(text()[1]) eq "3"]') = 1

【问题讨论】:

    标签: sql xml sql-server-2012 xquery


    【解决方案1】:

    以下查询将首先使用.nodes() 获取来自第一个 XML 的所有 <Person> 数字,然后使用关联子查询获取第二个 XML 的值作为可以是 INNER JOINed 的派生表。结果是一组减少到常见的数字。您可以按行的 ID 列对它们进行分组。

    DECLARE @tbl TABLE (ID INT IDENTITY, Xml1 XML, Xml2 XML);
    INSERT INTO @tbl VALUES
     ('<root><Person>1</Person><Person>3</Person><Person>6</Person></root>'
     ,'<root><Person>2</Person><Person>3</Person><Person>6</Person></root>');
    
    SELECT t1.ID
          ,p1.value('text()[1]','int')
    FROM @tbl t1
    CROSS APPLY t1.Xml1.nodes('/root/Person') A(p1)
    INNER JOIN(SELECT p2.value('text()[1]','int') AS p2_Nmbr 
               FROM @tbl t2 
               WHERE t1.ID=t2.ID
               CROSS APPLY t2.Xml2.nodes('/root/Person') B(p2)) Tbl_p2 ON p1.value('text()[1]','int')=Tbl_p2.p2_Nmbr;
    

    更新

    此查询将使用CROSS APPLY 将两个 XML 合并为一个。使用这个组合的 XML,您可以先运行 XQuery 以获取第一个的所有 ID 的不同列表,然后检查常见值:

    SELECT * 
           ,BothXml.query(N'for $p1 in distinct-values(/persons[1]/root[1]/Person/text())
                                  for $p2 in distinct-values(/persons[1]/root[2]/Person[text()=$p1]/text())
                                  return $p2    
                           ') AS CommonIDs
    FROM @tbl t
    CROSS APPLY(SELECT t.Xml1 AS [*],t.Xml2 AS [*] FOR XML PATH('persons'),TYPE) A(BothXml);
    

    如果没有公共 ID,则结果为空。

    【讨论】:

    • 我试图避免使用交叉应用。
    • @ShanShimb3o 为什么?
    • cross apply 会将 xml 转换为 sql 列和值。我想找到一种 xquery 可以直接做某事的方法。 xquery 应该通读 xml,然后进行比较。
    • @ShanShimb3o,这是不可能的,至少直接是这样……您的 XML 存在于两个不同的列中。 XQuery 不支持将另一个 XML 包含到 current XML...
    • @ShanShimb3o ... 至少直接 ...查看我的更新:-D
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多