【问题标题】:How to combine multiple XPath queries into one如何将多个 XPath 查询合并为一个
【发布时间】:2017-01-03 12:52:54
【问题描述】:

我有一张这样的桌子

create table [Trades] (
    [Id] int not null
    ,[TradeXML] xml not null
    )

这是 TradeXML xml 列的内容

<Trade>
  <Arg>
    <Name>Id</Name>
    <Data>
      <DataItem DataType="8">012345678</DataItem>
    </Data>
  </Arg>
  <Arg>
    <Name>Function</Name>
    <Data>
      <DataItem DataType="8">CapFloor</DataItem>
    </Data>
  </Arg>
  <Arg>
    <Name>Curve</Name>
    <Data>
      <DataItem DataType="8">EURCurve</DataItem>
    </Data>
  </Arg>
  <Arg>
    <Name>Rates</Name>
    <Data>
      <DataItem DataType="5">2.175</DataItem>
      <DataItem DataType="5">2.169</DataItem>
      <DataItem DataType="5">2.714</DataItem>
      <DataItem DataType="5">3.394</DataItem>
      <DataItem DataType="5">3.931</DataItem>
      <DataItem DataType="5">4.477</DataItem>
      <DataItem DataType="5">4.296</DataItem>
    </Data>
  </Arg>
  <Arg>
    <Name>Index</Name>
    <Data>
      <DataItem DataType="8">EURIBOR</DataItem>
    </Data>
  </Arg>
</Trade>

这个sql

select Node.Name.value('.', 'varchar(100)') Label
from Trades as t
cross apply t.TradeXML.nodes('//Arg/Name') Node(Name)

返回 5 行:

Id
Function
Curve
Rates
Index

这个sql

select Data.Name.value('.','varchar(100)') Value
from Trades as t
cross apply t.TradeXML.nodes('//Arg/Data/DataItem[1]') Data(Name)

返回 5 行:

012345678 
CapFloor 
EURCurve 
2.175 
EURIBOR 

还有这个

select Attribute.Name.query('local-name(.)') Attribute
    ,Attribute.Name.value('.', 'varchar(100)') Value
from Trades as t
cross apply t.TradeXML.nodes('//@*') Attribute(Name)

返回 11 行:

DataType 8 
DataType 8 
DataType 8 
DataType 5 
DataType 5 
DataType 5 
DataType 5 
DataType 5 
DataType 5 
DataType 5 
DataType 8 

但我想要的是这个(所以基本上是名称、(第一个)DataItem 值和(第一个)DataItem 的 DataType 属性的值)的组合,如下所示:

Id          012345678   8
Function    CapFloor    8
Curve       EURCurve    8
Rates       2.175       5
Index       EURIBOR     8

我已将其保存在 rextester 中以供使用。我自己尝试将它们结合起来,但没有设法得到正确的结果。 任何帮助将不胜感激!

【问题讨论】:

    标签: sql-server xml xpath


    【解决方案1】:

    Arg元素上分解XML,并从那里开始选择所需的信息:

    select 
        Node.Arg.value('Name[1]', 'varchar(100)') Label,
        Node.Arg.value('(Data/DataItem)[1]', 'varchar(100)') DataItem,
        Node.Arg.value('(Data/DataItem)[1]/@DataType', 'varchar(100)') DataType
    from Trades as t
    cross apply t.TradeXML.nodes('//Arg') Node(Arg)
    

    rextester demo

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2019-07-11
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多