简体   繁体   中英

How to get value of a specific node from and xml based on specific condition sql

I have a XML where i want to fetch the value of scheduleName where GrantName=Grant 2 and Scheduleid=003.

I am also joining the result with a table which contains client information. For every client id i want to fetch the schedule name as mentioned.

Below is the sample XML which i am using.

DECLARE @tbl TABLE (XmlCol xml)
INSERT INTO @tbl VALUES 
('<option>
            <OptionName>Option 1</OptionName>
            <grant>
                    <GrantName>Grant 1</GrantName>
                            <schedules>
                                            <schedule>
                                                            <scheduleID id=001></scheduleID>
                                                            <scheduleName>s1</scheduleName>
                                                            <scheduleDate>1/1/2018</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                                            <schedule>
                                                            <scheduleID id=002></scheduleID>
                                                            <scheduleName>s2</scheduleName>
                                                            <scheduleDate>2/1/2018</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                                            <schedule>
                                                            <scheduleID id=003></scheduleID>
                                                            <scheduleName>s3</scheduleName>
                                                            <scheduleDate>3/1/2018</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                            </schedules>
            </grant>
            <grant>
                            <GrantName>Grant 2</GrantName>
                            <schedules>
                                            <schedule>
                                                            <scheduleID id=001></scheduleID>
                                                            <scheduleName>s1</scheduleName>
                                                            <scheduleDate>1/1/2019</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                                            <schedule>
                                                            <scheduleID id=002></scheduleID>
                                                            <scheduleName>s2</scheduleName>
                                                            <scheduleDate>2/1/2019</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                                            <schedule>
                                                            <scheduleID id=003></scheduleID>
                                                            <scheduleName>s3</scheduleName>
                                                            <scheduleDate>3/1/2019</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                            </schedules>
            </grant>
            <grant>
                            <GrantName>Grant 3</GrantName>
                            <schedules>
                                            <schedule>
                                                            <scheduleID id=001></scheduleID>
                                                            <scheduleName>s1</scheduleName>
                                                            <scheduleDate>1/1/2020</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                                            <schedule>
                                                            <scheduleID id=002></scheduleID>
                                                            <scheduleName>s2</scheduleName>
                                                            <scheduleDate>2/1/2020</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                                            <schedule>
                                                            <scheduleID id=003></scheduleID>
                                                            <scheduleName>s3</scheduleName>
                                                            <scheduleDate>3/1/2020</scheduleDate>
                                                            <scheduleAmount></scheduleAmount>
                                            </schedule>
                            </schedules>
            </grant>
        </option>'
)

Please help me with the query in sql

DECLARE @tbl TABLE (XmlCol xml)
INSERT INTO @tbl VALUES 
('<Fact>
  <ID Value="d71a58e9-6e9c-4c2b-9a6a-76e066978af4" />
  <AssetAllocationModel>
    <ModelPortfolios>
      <ModelPortfolio>
        <Name>Asset Pres</Name>
        <ModelPortfolioID Value="assetpres" />
        <AssetClassMix>
          <Percent>0.1000</Percent>
          <AssetClassID Value="largegrowth" />
          <Value />
        </AssetClassMix>
        <AssetClassMix>
          <Percent>0.0500</Percent>
          <AssetClassID Value="largevalue" />
          <Value />
        </AssetClassMix>
        <AssetClassMix>
          <Percent>0.2500</Percent>
          <AssetClassID Value="investbond" />
          <Value />
        </AssetClassMix>
        <AssetClassMix>
          <Percent>0.5000</Percent>
          <AssetClassID Value="shortermbond" />
          <Value />
        </AssetClassMix>
        <AssetClassMix>
          <Percent>0.1000</Percent>
          <AssetClassID Value="cash" />
          <Value />
        </AssetClassMix>
        <Risk>0</Risk>
      </ModelPortfolio>
              <ModelPortfolio>
                     <Name>Income</Name>
                     <ModelPortfolioID Value="income" />
                     <AssetClassMix>
                           <Percent>0.3000</Percent>
                           <AssetClassID Value="investbond" />
                           <Value />
                     </AssetClassMix>
                     <AssetClassMix>
                           <Percent>0.3500</Percent>
                           <AssetClassID Value="shortermbond" />
                           <Value />
                     </AssetClassMix>
                     <AssetClassMix>
                           <Percent>0.0500</Percent>
                           <AssetClassID Value="cash" />
                           <Value />
                     </AssetClassMix>
                     <Risk>0</Risk>
              </ModelPortfolio>
       <ModelPortfolio>
        <Name>Agg Growth</Name>
        <ModelPortfolioID Value="aggrgrowth" />
        <AssetClassMix>
          <Percent>0.1000</Percent>
          <AssetClassID Value="internat" />
          <Value />
        </AssetClassMix>
        <AssetClassMix>
          <Percent>0.1000</Percent>
          <AssetClassID Value="emerging" />
          <Value />
        </AssetClassMix>
        <AssetClassMix>
          <Percent>0.0300</Percent>
          <AssetClassID Value="highyldbond" />
          <Value />
        </AssetClassMix>
        <AssetClassMix>
          <Percent>0.0200</Percent>
          <AssetClassID Value="cash" />
          <Value />
        </AssetClassMix>
        <Risk>0</Risk>
      </ModelPortfolio>
    </ModelPortfolios>
  </AssetAllocationModel>
  <AttestationDate />
</Fact>'
)

select * from @tbl

SELECT top 1 t.x.value('(./Percent)[1]','decimal(10,2)')*100 FROM(
       SELECT t.x.query('(./AssetClassMix)') as 'AssetClassMix'
       FROM @tbl rec
       CROSS APPLY rec.XmlCol.nodes ('/Fact/AssetAllocationModel/ModelPortfolios/ModelPortfolio')  t(x)
       WHERE t.x.value('(./ModelPortfolioID/@Value)[1]','varchar(max)') = 'aggrgrowth'
) a
CROSS APPLY a.AssetClassMix.nodes('/AssetClassMix') t(x)
WHERE t.x.value('(./AssetClassID/@Value)[1]','varchar(max)')='cash'

This is what i am using to get the value. Is there any other way without using CROSS APPLY. Since in PROD there is huge data, CROSS APPLY is very heavy.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM