簡體   English   中英

在 SQL 服務器 XML 列中,我如何驗證相同的值是否存在於多行中

[英]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)')

請建議我

表名是Table1Id列是主鍵。 在此處輸入圖像描述

在提取了相關的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM