如何使用GROUP_CONCAT拼接两列?指定ID集字符串拼接实现
实现指定ID记录的字符串拼接方案
这个需求核心就是把id IN(1,2,3)范围内的有效字符串(id=1取parent_string,id=2、3取非空的child_string)用~连接起来。下面分几种常用数据库给出具体实现:
MySQL/MariaDB 版本
利用GROUP_CONCAT函数直接完成字符串聚合,指定分隔符即可:
SELECT GROUP_CONCAT( CASE WHEN child_string IS NULL THEN parent_string ELSE child_string END SEPARATOR '~' ) AS concatenated_result FROM your_table_name WHERE id IN (1, 2, 3);
CASE语句负责判断每条记录应该取哪个字段值,GROUP_CONCAT自动把这些值按~拼接成单个字符串。
PostgreSQL 版本
使用PostgreSQL原生的STRING_AGG函数,用法和GROUP_CONCAT类似:
SELECT STRING_AGG( CASE WHEN child_string IS NULL THEN parent_string ELSE child_string END, '~' ) AS concatenated_result FROM your_table_name WHERE id IN (1, 2, 3);
SQL Server 版本
- 2017及以上版本:支持
STRING_AGG函数,写法简洁:
SELECT STRING_AGG( CASE WHEN child_string IS NULL THEN parent_string ELSE child_string END, '~' ) AS concatenated_result FROM your_table_name WHERE id IN (1, 2, 3);
- 2016及更早版本:需要用
STUFF结合FOR XML PATH的方式实现:
SELECT STUFF( (SELECT '~' + CASE WHEN child_string IS NULL THEN parent_string ELSE child_string END FROM your_table_name WHERE id IN (1, 2, 3) FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '' ) AS concatenated_result;
FOR XML PATH('')会把所有字符串用~连接,但开头会多一个冗余的~,STUFF函数用来移除这个多余的分隔符。
Oracle 版本
使用LISTAGG函数,注意需要指定排序规则保证拼接顺序和ID一致:
SELECT LISTAGG( CASE WHEN child_string IS NULL THEN parent_string ELSE child_string END, '~' ) WITHIN GROUP (ORDER BY id) AS concatenated_result FROM your_table_name WHERE id IN (1, 2, 3);
内容的提问来源于stack exchange,提问作者mansi




