You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL中如何去除listagg函数拼接结果中的重复值

解决方案

你目前的写法是先把所有行的技术标记全部拼接再尝试去重,自然会产生重复内容。你只有3类固定技术,更推荐直接在分组聚合阶段先判断每类技术是否存在,从根源避免重复,逻辑更稳定、性能也更好:

SELECT
    NAME,
    RTRIM(
        CASE WHEN MAX(Membrane_column) IS NOT NULL THEN 'Membrane, ' END
        || CASE WHEN MAX(SNR_column) IS NOT NULL THEN 'SNR, ' END
        || CASE WHEN MAX(SMR_column) IS NOT NULL THEN 'SMR, ' END
    , ', ') AS TECHNOLOGY
FROM Table A
GROUP BY NAME

上述代码逻辑:按NAME分组后,只要组内任意一行存在对应技术的标记,MAX就能返回非空值,对应技术名就会被拼接,天然保证每类技术最多出现1次,完全匹配你的预期输出。

如果你希望沿用原LISTAGG+正则的写法,也可以修改正则规则实现去重:

SELECT
    NAME,
    RTRIM(
        REGEXP_REPLACE(
            LISTAGG(
                NVL2(Membrane_column, 'Membrane, ', NULL)
                || NVL2(SNR_column, 'SNR, ', NULL)
                || NVL2(SMR_column, 'SMR, ', NULL)
            ) WITHIN GROUP (ORDER BY name),
            '([^, ]+, )\1+', '\1'
        ),
    ', ') AS TECHNOLOGY
FROM Table A
GROUP BY NAME

该正则会匹配连续重复的技术名, 片段,仅保留第一个片段,实现重复内容清除。

内容的提问来源于stack exchange,提问作者Vincent Toong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:24:05