簡體   English   中英

從 XML 列中提取某些值

[英]Extracting certain values from XML column

我有以下 sql 查詢:

 select         
I.N.value('@DRN', 'varchar(50)') as DRN,
I.N.value('@CR_GUID', 'varchar(50)') AS CR,
I.N.value('@DR_GUID', 'varchar(50)') AS DR,
I.N.value('@AMOUNT', 'money') as Amount,
I.N.value('@DATE', 'Date') as ProDate
from Table as T
cross apply T.column.nodes('/ITEMS/ITEM') as I(N)

目前它將帶回一切,例如:

DRN    CR         DR        Amount        Prodate
12     2p1rf      684pb     4686.23       2012-11-14
12     586io      fdc25     4686.23       2012-11-16
13     hnv7p      19i6f     1800.00       2012-11-20
14     cd7k0      9s2vc      570.50       2012-11-20
15     pm78s      qw3d5     8500.00       2012-11-23

我如何從結果中排除以下內容,這是來自 xml 列中的同一行?

 DRN    CR         DR        Amount        Prodate
*12*     2p1rf      684pb     4686.23       2012-11-14
*12*     586io      fdc25     4686.23       2012-11-16

我只希望查詢帶回 xml 列中的一項而不是多個值的行。

謝謝你

那么我如何才能只帶回包含多個項目的連續第一項:

 DRN    CR         DR        Amount        Prodate
*12*     2p1rf      684pb     4686.23       2012-11-14
*12*     586io      fdc25     4686.23       2012-11-16

所以我只想看到日期為 2012-11-14 的項目而不是與該行有關的所有內容? 我希望這是有道理的?

您應該能夠進行內聯聚合並對其進行過濾

SELECT
    X.DRN, X.CR, X.DR, X.Amount, X.ProDate
FROM
    (
    SELECT
        COUNT(*) OVER (PARTITION BY I.N.value('@DRN', 'varchar(50)')) AS CountPerDRN,
        I.N.value('@DRN', 'varchar(50)') as DRN,
        I.N.value('@CR_GUID', 'varchar(50)') AS CR,
        I.N.value('@DR_GUID', 'varchar(50)') AS DR,
        I.N.value('@AMOUNT', 'money') as Amount,
        I.N.value('@DATE', 'Date') as ProDate
    from
        MyTable as T
        cross apply
        T.Mycolumn.nodes('/ITEMS/ITEM') as I(N)
    ) X
WHERE
   X.CountPerDRN= 1

編輯,添加問題后

只需將內聯聚合更改為窗口函數
在這種情況下,我選擇了基於最低ProDate的行

SELECT
    X.DRN, X.CR, X.DR, X.Amount, X.ProDate
FROM
    (
    SELECT
        ROW_NUMBER() OVER (
                  PARTITION BY I.N.value('@DRN', 'varchar(50)')
                  ORDER BY I.N.value('@DATE', 'Date')
                  ) AS rnPerDRN,
        I.N.value('@DRN', 'varchar(50)') as DRN,
        I.N.value('@CR_GUID', 'varchar(50)') AS CR,
        I.N.value('@DR_GUID', 'varchar(50)') AS DR,
        I.N.value('@AMOUNT', 'money') as Amount,
        I.N.value('@DATE', 'Date') as ProDate
    from
        MyTable as T
        cross apply
        T.Mycolumn.nodes('/ITEMS/ITEM') as I(N)
    ) X
WHERE
   X.rnPerDRN = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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