我有一个包含以下示例列的表,其数据如下所示。每个帐号都有相应的createddt
和xmlpayload
列值。
在给定的4行中,我需要找到有效的重复项。每个有效帐号都有2 xml行(一个语句和一个pdf xml记录)。如果帐号有2条记录具有相同类型的xml根节点,如pdf record(2335577),则它应该是重复的。如何通过查询xml列来过滤确切的重复项。请帮忙。
Records:
AccountNo **Xmlpayload**
2335566 <ns0:Statement xmlns:ns0="uri"><empid>123<empid/><ns0:Statement>
2335566 <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>
2335577 <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>
2335577 <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>
4332355 <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>
4332355 <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>
6723588 <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>
6723588 <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>
My Expected Output:
2335577 <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>
2335577 <ns0:PDFStmt xmlns:ns0="uri"><empid>123<empid/></ns0:PDFStmt>
6723588 <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>
6723588 <ns0:Statement xmlns:ns0="uri"><empid>123<empid/></ns0:Statement>
我正在使用SQL 2008 R2版本。
答案 0 :(得分:1)
对于SQL Server,您可以使用sqlxml中的exist()方法,如下所示:
with xmlnamespaces ('uri' as ns0)
select *
from Table1 as t
where t.Xmlpayload.exist('ns0:PDF[2]') = 1
或者您可以使用xquery count()函数和value()方法:
with xmlnamespaces ('uri' as ns0)
select *
from Table1 as t
where t.Xmlpayload.value('count(ns0:PDF)', 'int') > 1;
<强> sql fiddle demo 强>
<强>更新强>
如果每个AccountNo都有一个,您可以使用此查询:
with xmlnamespaces ('uri' as ns0)
select *
from Table2 as t
where t.Xmlpayload.exist('ns0:PDFStmt[2]') = 1
如果每个AccountNo有多行(并希望在结果集中获得Xmlpayload):
with
xmlnamespaces ('uri' as ns0),
cte as (
select
*, count(*) over(partition by AccountNo) as cnt
from Table1 as t
where t.Xmlpayload.exist('ns0:PDFStmt') = 1
)
select *
from cte
where cnt > 1;
<强> sql fiddle demo 强>
答案 1 :(得分:0)
我不是100%想要算什么。我所知道的是,您可以在MSSQL版本中计算XML文件中的节点,如下所示:
declare @xml xml
select @xml= convert(xml,N'<ns0 xmlns:ns0="uri"><empid>123</empid><age>23</age></ns0>
<ns0 xmlns:ns0="uri"><empid>123</empid><age>32</age></ns0>
<ns0 xmlns:ns0="uri"><empid>123</empid><age>23</age></ns0>
<ns0 xmlns:ns0="uri"><empid>123</empid><age>32</age></ns0>')
select count(*) as nr
from @xml.nodes('root/ns0/empid') as S(N)
请注意我也修改了你的xml因为无效。我改变了 empid&gt; 123 empid /&gt; 在 empid&gt; 123 / empid&gt;
,年龄相同
我删除了:声明和:PDF。这部分是有效的,但我不知道用于搜索这样的throw节点的sysntax,但也适用于它们。