将 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 APPLYvarchar转换为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 类型的列中。