You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动