在XML列中查找重复值

时间:2014-08-30 07:49:20

标签: sql-server xml

在我的SQL Server数据库中,我有一个带有XML列的表。其中包含的XML类似于以下示例:

<Rows>
      <Row>
           <Name>John</Name>
      </Row>
      <Row>
           <Name>Debbie</Name>
      </Row>
      <Row>
           <Name>Annie</Name>
      </Row>
      <Row>
           <Name>John</Name>
      </Row>
</Rows>

我要求我需要找到XML数据具有<Name>重复条目的所有行的出现位置。例如,上面我们有John&#39;在XML中两次。

我可以使用exist XML语句查找1个匹配项,但如何查找它是否超过1?感谢。

2 个答案:

答案 0 :(得分:1)

要识别XML中具有重复<Name>值的任何表格行,您也可以使用exist

exist('//Name[. = preceding::Name]')

要分别识别哪些名称是重复的,您需要nodesCROSS APPLY

SELECT
  t.id,
  x.Name.value('.', 'varchar(100)') AS DuplicateName
FROM
  MyTable t
  CROSS APPLY t.MyXmlColumn.nodes('//Name[. = preceding::Name]') AS x(Name)
WHERE
  t.MyXmlColumn.exist('//Name[. = preceding::Name]')

答案 1 :(得分:1)

试试这个:

;with cte as
(SELECT tbl.col.value('.[1]', 'varchar(100)') as name
 FROM   yourtable
 CROSS APPLY xmlcol.nodes('/Rows/Row/Name') as tbl(col))

select name
from cte
group by name
having count(name) > 1

我们首先使用nodes函数将XML转换为关系数据,然后使用value获取Name节点内的文本。然后,我们将上一步的结果放入CTE,并使用简单的group by来获取多次出现的值。

Demo