使用 FOR XML 连接多行的值
FOR XML
函数的一个常见用途是连接多行的值。
以下是使用 Customers 表的示例 :
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH('')),
1, 1, '')
在上面的示例中,FOR XML PATH(''))
用于连接电子邮件地址,使用 ;
作为分隔符。此外,STUFF
的目的是从连接的字符串中删除前导 ;
。STUFF
也隐式地将连接的字符串从 XML 转换为 varchar。
注意:上面示例的结果将是 XML 编码的,这意味着它将用 <
等替换 <
字符。如果你不想这样,请将 FOR XML PATH(''))
更改为 FOR XML PATH, TYPE).value('.[1]','
varchar(MAX)')
,例如:
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH, TYPE).value('.[1]','varchar(900)'),
1, 1, '')
这可以用来实现类似于 MySQL 中的 GROUP_CONCAT
或 PostgreSQL 9.0+中的 string_agg
的结果,尽管我们使用子查询而不是 GROUP BY 聚合。 (作为替代方案,如果你正在寻找更接近 GROUP_CONCAT
的功能,你可以安装用户定义的聚合,例如此聚合 )。