sql - 如何从 SQL 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>
我的目标是获得如下所示的输出:
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
在以这种方式组织 XML 的广泛搜索之后,我在 stackoverflow 上找不到任何示例,而我发现、调整和应用的示例导致我在一列中获得所有值的列表(状态值、BenefitType 值等) . 与 DrugName 值混合在一起)。
ID 列不是 XML 的一部分,但我需要在输出中包含它。
解决方案
您需要.nodes
XML 函数来拆分 Trigger 节点,然后再拆分 Values 行。
要获取节点的值而不是其名称,我们使用text()
.
为了验证我们Trigger
为每一列抓取了正确的节点,我们使用[]
谓词来检查(有点像 a where
)。
.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)
推荐阅读
- c++ - 无法从 QProcess 获取所有输出
- flutter - LateInitializationError:尚未为类模型初始化字段“错误”
- visual-studio-code - 在 vscode 片段正则表达式中使用美元符号
- flutter - Flutter on web,使用 url 中的查询参数重定向到初始路由
- python - 通过 Python 将多个输入管道传输到 FFMPEG
- c# - 如何使用 .Net/Mono TCP/UDP Socket 通过代理连接?
- android - 清除应用程序数据时出现Android构建问题?
- python - Windows 10,bat 文件,python PermissionError:[Errno 13]
- php - 如何返回第一次切换php
- go - Fetch complete objects including children using Golang and Gorm