将 varchar 列中的 XML 标签列表转换为逗号分隔列表
Convert List Of XML Tags in varchar column to comma separated list
我有一个 table,其中包含 xml tags/values 的列表,我需要使用它来加入另一个 table 以检索它们的实际值并显示结果作为 csv 列表。
示例 varchar 数据:
<choice id="100"/><choice id="101"/><choice id="102"/>
但是,这些值实际上会转换为其他值:分别为红色、白色和蓝色。我需要将该列表转换为以下列表:
red,white,blue
回顾一下,“源”table 列是 varchar,包含一个 xml 属性值列表,这些值通过连接到另一个 table.因此,另一个 table 的主键为 id (int),行数为 100,101,102。这些行中的每一行分别具有红色、白色、蓝色的值。我希望这足够有意义。
这是设置场景的 ddl:
create table datatable(
id int,
data nvarchar(449)
primary key (id)
);
insert into datatable(id, data)
values(1,'<choice id="100"/><choice id="101"/><choice id="102"/>')
,(2,'<choice id="100"/>')
,(3,'<choice id="101"/>')
,(4,'<choice id="102"/>');
create table choicetable(
id int,
choicevalue nvarchar(449)
primary key (id)
);
insert into choicetable(id, choicevalue)
values(100,'red')
,(101,'white')
,(102,'blue');
这将是我第一次尝试以这种方式解析 XML,所以我有点不知从何入手。此外,我无法控制我从(第 3 方软件)检索数据的数据库。
没有适当的示例数据,很难给出准确的查询。但是你会做这样的事情
- 使用
CROSS APPLY
将varchar
转换为xml
- 使用
.nodes
将 XML 切碎成单独的行。
- 使用
.value
加入以获得 id
属性
- 分组,并使用
STRING_AGG
连接。根据您的情况,您可能不需要 GROUP BY
。
SELECT
xt.Id,
STRING_AGG(ot.Value, ',')
FROM XmlTable xt
CROSS APPLY (SELECT CAST(xt.XmlColumn AS xml) ) v(XmlData)
CROSS APPLY v.XmlData.nodes('/choice') x1(choice)
JOIN OtherTable ot ON ot.Id = x1.choice.value('@id','int')
GROUP BY
xt.Id;
我建议您尽可能将 XML 数据存储在 xml
类型的列中。
我有一个 table,其中包含 xml tags/values 的列表,我需要使用它来加入另一个 table 以检索它们的实际值并显示结果作为 csv 列表。
示例 varchar 数据:
<choice id="100"/><choice id="101"/><choice id="102"/>
但是,这些值实际上会转换为其他值:分别为红色、白色和蓝色。我需要将该列表转换为以下列表:
red,white,blue
回顾一下,“源”table 列是 varchar,包含一个 xml 属性值列表,这些值通过连接到另一个 table.因此,另一个 table 的主键为 id (int),行数为 100,101,102。这些行中的每一行分别具有红色、白色、蓝色的值。我希望这足够有意义。
这是设置场景的 ddl:
create table datatable(
id int,
data nvarchar(449)
primary key (id)
);
insert into datatable(id, data)
values(1,'<choice id="100"/><choice id="101"/><choice id="102"/>')
,(2,'<choice id="100"/>')
,(3,'<choice id="101"/>')
,(4,'<choice id="102"/>');
create table choicetable(
id int,
choicevalue nvarchar(449)
primary key (id)
);
insert into choicetable(id, choicevalue)
values(100,'red')
,(101,'white')
,(102,'blue');
这将是我第一次尝试以这种方式解析 XML,所以我有点不知从何入手。此外,我无法控制我从(第 3 方软件)检索数据的数据库。
没有适当的示例数据,很难给出准确的查询。但是你会做这样的事情
- 使用
CROSS APPLY
将varchar
转换为xml
- 使用
.nodes
将 XML 切碎成单独的行。 - 使用
.value
加入以获得id
属性 - 分组,并使用
STRING_AGG
连接。根据您的情况,您可能不需要GROUP BY
。
SELECT
xt.Id,
STRING_AGG(ot.Value, ',')
FROM XmlTable xt
CROSS APPLY (SELECT CAST(xt.XmlColumn AS xml) ) v(XmlData)
CROSS APPLY v.XmlData.nodes('/choice') x1(choice)
JOIN OtherTable ot ON ot.Id = x1.choice.value('@id','int')
GROUP BY
xt.Id;
我建议您尽可能将 XML 数据存储在 xml
类型的列中。