[英]In SQL Server XML column how do I verify whether same value is present in more than one rows or not
在 SQL 服務器 XML 列中,如何驗證相同的值是否存在於多行中?
價值可能是動態的——它不是固定的。 請參考下表,其中 Id 列是主鍵,ExtendedData 列中的 Tag 值可能超過 1 行。
查詢 INSERT 記錄到表中
DECLARE @Table1 TABLE (Id BIGINT, AccountNumber int,ExtendedData XML)
INSERT INTO @Table1 (Id,AccountNumber,ExtendedData) VALUES
(1, 14, '<ExtendedData> <Data> <POLICYNBR>131313</POLICYNBR> <ACCOUNTNBR>GGAHAHA</ACCOUNTNBR> <ID>29499785613092400202</ID> </Data></ExtendedData>'),
(2, 14, '<ExtendedData> <Data> <POLICYNBR>131313</POLICYNBR> <ACCOUNTNBR>GGAHAHA</ACCOUNTNBR> <ID>29499785613092400202</ID> </Data></ExtendedData>'),
(3, 14, '<ExtendedData> <Data> <POLICYNBR>54555</POLICYNBR> <ACCOUNTNBR>GGAHAHA</ACCOUNTNBR> <ID>123485613092400202</ID> </Data></ExtendedData>'),
(4, 13, '<ExtendedData> <Data> <POLICYNBR>54555</POLICYNBR> <ACCOUNTNBR>GGAHAHA</ACCOUNTNBR> <ID>123485613092400202</ID> </Data></ExtendedData>')
預期結果:- 如果我通過 Account id =14 那么我應該能夠在響應中看到兩條記錄,因為 accountId=14 標簽在 ExtendedData 列中具有相同的值。
這是我的腳本: - 但它似乎不起作用,它沒有給出我期望的結果。
select * from Table1 where AccountId =14 and
ExtendedData.value('(/ExtendedData/Data/ID/text())[1]','varchar(10)') = select CAST(ExtendedData as XML).value('(/ExtendedData/Data/ID/)[1]', 'nvarchar(20)') from Table1 where ExtendedData.value('(/ExtendedData/Data/ID/text())[1]','varchar(10)')
請建議我
在提取了相關的 id 值之后,聽起來你只需要一個having
select t.AccountId, v.ExtendedId
from Table1 t
cross apply (values(
ExtendedData.value('(/ExtendedData/Data/ID/text())[1]','varchar(10)')
) ) v(ExtendedId)
where AccountId = 14
group by t.AccountId, v.ExtendedId
having count(*) > 1
首先是一些可重復使用的樣本數據:
DECLARE @xml XML =
'<ExtendedData>
<Data>
<PolNbr>123999</PolNbr>
<ActNbr>ABCZZZ</ActNbr>
<ID>555444</ID>
</Data>
</ExtendedData>
<ExtendedData>
<Data>
<PolNbr>123999</PolNbr>
<ActNbr>ABCXXX</ActNbr>
<ID>555667</ID>
</Data>
</ExtendedData>
<ExtendedData>
<Data>
<PolNbr>123111</PolNbr>
<ActNbr>ABCZZZ</ActNbr>
<ID>555667</ID>
</Data>
</ExtendedData>
<ExtendedData>
<Data>
<PolNbr>123113</PolNbr>
<ActNbr>ABCXXX</ActNbr>
<ID>555666</ID>
</Data>
</ExtendedData>'
SELECT
ID = n.X.value('(ID)[1]','varchar(100)'),
PolNbr = n.X.value('(PolNbr)[1]','VARCHAR(100)'),
ActNbr = n.X.value('(ActNbr)[1]','varchar(100)')
FROM (VALUES(@xml)) AS f(X)
CROSS APPLY f.X.nodes('/ExtendedData/Data') AS n(X);
注意 output:
ID PolNbr ActNbr
-------- --------- ----------
555444 123999 ABCZZZ
555667 123999 ABCXXX
555667 123111 ABCZZZ
555666 123113 ABCXXX
現在我們可以調整查詢以識別任何重復值:
--==== ID
SELECT ID_Duplicates = nd.X
FROM (VALUES(@xml)) AS f(X)
CROSS APPLY f.X.nodes('/ExtendedData/Data') AS n(X)
CROSS APPLY (VALUES(n.X.value('(ID)[1]','varchar(100)'))) AS nd(X)
GROUP BY nd.X
HAVING COUNT(*) > 1
--==== PolNbr
SELECT PolNbr_Duplicates = nd.X
FROM (VALUES(@xml)) AS f(X)
CROSS APPLY f.X.nodes('/ExtendedData/Data') AS n(X)
CROSS APPLY (VALUES(n.X.value('(PolNbr)[1]','varchar(100)'))) AS nd(X)
GROUP BY nd.X
HAVING COUNT(*) > 1;
--==== PolNbr
SELECT ActNbr_Duplicates = nd.X
FROM (VALUES(@xml)) AS f(X)
CROSS APPLY f.X.nodes('/ExtendedData/Data') AS n(X)
CROSS APPLY (VALUES(n.X.value('(ActNbr)[1]','varchar(100)'))) AS nd(X)
GROUP BY nd.X
HAVING COUNT(*) > 1;
結果:
ID_Duplicates
------------------------------------------
555667
PolNbr_Duplicates
------------------------------------------
123999
ActNbr_Duplicates
------------------------------------------
ABCXXX
ABCZZZ
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.