简体   繁体   English

如何从 SQL XML 列中提取值列表

[英]How to extract a list of values from a SQL XML column

Here is my XML:这是我的 XML:

<Triggers>
  <Trigger>
    <Name>DrugName</Name>
    <Values>
      <Value>Meclofenamate</Value>
      <Value>Meloxicam</Value>
      <Value>Vimovo</Value>
      <Value>Nabumetone</Value>
      <Value>Qmiiz</Value>
      <Value>Tolmetin</Value>    
    </Values>
  </Trigger>
  <Trigger>
    <Name>State</Name>
    <Values>
      <Value>MI</Value>
    </Values>
  </Trigger>
  <Trigger>
    <Name>BenefitType</Name>
    <Values>
      <Value>Pharmacy</Value>
    </Values>
  </Trigger>
  <Trigger>
    <Name>LineOfBusiness</Name>
    <Values>
      <Value>Medicaid</Value>
    </Values>
  </Trigger>
</Triggers>

My goal is to get output that looks like this:我的目标是让 output 看起来像这样:

ID      DrugName        State     BenefitType   LineOfBusiness
6500    Meclofenamate   MI        Pharmacy      Medicaid
6501    Meloxicam       MI        Pharmacy      Medicaid
6502    Vimovo          MI        Pharmacy      Medicaid
6503    Nabumetone      MI        Pharmacy      Medicaid
6504    Qmiiz           MI        Pharmacy      Medicaid
6505    Tolmetin        MI        Pharmacy      Medicaid

I can't find any examples on stackoverflow after extensive searches where XML is organized this way, and the examples I have found, tweaked and applied result in my getting a list of all the Values in one column (State values, BenefitType values, etc. mixed in with DrugName values).在广泛搜索 XML 以这种方式组织后,我在 stackoverflow 上找不到任何示例,而我发现、调整和应用的示例导致我在一列中获得所有值的列表(状态值、BenefitType 值等. 与 DrugName 值混合在一起)。

The ID column is not part of the XML, but I need to have that in my output. ID 列不是 XML 的一部分,但我需要在我的 output 中有它。

Here what the table looks like that has the XML column.这里的表格看起来像 XML 列。

You needs the .nodes XML function to break out the Trigger nodes, then again for Values rows.您需要.nodes XML function 来断开触发节点,然后再断开值行。

To get the value of a node instead of it's name, we use text() .要获取节点的值而不是其名称,我们使用text()

To verify we are grabbing the right Trigger node for each column, we use the [] predicate to check (a bit like a where ).为了验证我们是否为每一列抓取了正确的Trigger节点,我们使用[]谓词进行检查(有点像where )。

.value requires a single value, so we use [1] to get the first node. .value需要单个值,因此我们使用[1]来获取第一个节点。

SELECT
    DrugName = drugs.DrugName.value('text()[1]','nvarchar(100)'),
    State = tr.Trigg.value('Trigger[Name/text()="State"][1]/Values[1]/Value[1]/text()[1]', 'nvarchar(100)'),
    BenefitType = tr.Trigg.value('Trigger[Name/text()="BenefitType"][1]/Values[1]/Value[1]/text()[1]', 'nvarchar(100)'),
    LineOfBusiness = tr.Trigg.value('Trigger[Name/text()="LineOfBusiness"][1]/Values[1]/Value[1]/text()[1]', 'nvarchar(100)')
FROM @xml.nodes('/Triggers') tr(Trigg)
OUTER APPLY tr.Trigg.nodes('Trigger[Name/text()="DrugName"][1]/Values/Value') drugs(DrugName)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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