sql-server - 从 XML 中提取多个值并在一行中返回
问题描述
在 SQL Server 上,我在记录上有一个 XML 字段,它包含多个相似类型的节点,但具有不同的 ID。
我想从该 XML 中提取一些 ID 并返回一行。
下面是一个简单的 XML 示例:
...
<Items>
<Item>
<ItemID>1</ItemID>
<ItemValue>A</ItemValue>
</Item>
<Item>
<ItemID>2</ItemID>
<ItemValue>B</ItemValue>
</Item>
</Items>
我想在一行上输出我正在搜索的特定项目的值。
就像是
select XML_Values
from the_table
where conditions_met = true
我使用了交叉应用,可以只返回所需值的节点,但输出都在单独的行上。理想情况下,Id 喜欢的输出类似于以下内容:
| Id=1 | Id=2 | (Column headers)
| A | B |
我会非常感谢任何帮助。
解决方案
请尝试以下解决方案。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<Items>
<Item>
<ItemID>1</ItemID>
<ItemValue>A</ItemValue>
</Item>
<Item>
<ItemID>2</ItemID>
<ItemValue>B</ItemValue>
</Item>
</Items>');
-- DDL and sample data population, end
SELECT ID
, c.value('(Item[1]/ItemValue/text())[1]','VARCHAR(30)') AS Item1
, c.value('(Item[2]/ItemValue/text())[1]','VARCHAR(30)') AS Item2
FROM @tbl
CROSS APPLY xmldata.nodes('/Items') AS t(c);
输出
+----+-------+-------+
| ID | Item1 | Item2 |
+----+-------+-------+
| 1 | A | B |
+----+-------+-------+
推荐阅读
- java - 什么是数据库 url 的“jdbc:mysql:”部分?
- angular - 如何在 Angular Google Maps 中绘制填充弧?
- java - 当它说找不到或无法加载主类时,我怎样才能让这个程序运行?
- javascript - :key 可以在 VUE 中不使用 v-for 吗?
- android - 如何从数字键盘检查交叉(取消)按钮单击
- python - 有没有一种方法可以从这个连续的周期性日期时间序列中更新月平均加权?
- apache-spark - 如何使用不同的df列更新现有列
- tensorflow - SSD mobilenet 模型无法检测到更远距离的物体
- amazon-web-services - Lambda Kinesis Stream 消费者并发问题
- machine-learning - glove 和 word2vec 之间的主要区别是什么?