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
相关产品推荐
相关产品推荐

