如何用Postgres的regexp_replace去除逗号分隔字符串中的重复项?
PostgreSQL 逗号分隔字符串去重方案
方案1:使用regexp_replace正则匹配去重
如果一定要用regexp_replace,可以通过反向引用匹配已出现的元素,但需要先统一分隔符格式(处理无空格的逗号):
-- 先标准化分隔符为", ",再匹配重复元素替换 SELECT regexp_replace( regexp_replace('emarian, eiulian, evasile, emarina,emarian, eiulian, evasile, emarina', ',\s*', ', ', 'g'), '(\b\w+\b)(?:, \1)+', '\1', 'g' );
正则说明:
(\b\w+\b):匹配单个单词元素(作为分组1)(?:, \1)+:匹配后续重复的同元素(非捕获分组,避免干扰替换)'\1':用第一次出现的元素替换重复序列'g':全局匹配替换
方案2:拆分-去重-聚合(更可靠)
纯正则对格式敏感,复杂场景容易出错,更稳妥的方式是拆分字符串为行、去重后重新聚合:
SELECT string_agg(DISTINCT trim(elem), ', ') AS unique_list FROM unnest(string_to_array('emarian, eiulian, evasile, emarina,emarian, eiulian, evasile, emarina', ',')) AS elem;
步骤说明:
string_to_array:按逗号把字符串拆成数组unnest:将数组转为单行记录trim(elem):清除每个元素前后的空格DISTINCT:去除重复元素string_agg:把去重后的元素用,拼接成字符串
内容的提问来源于stack exchange,提问作者Iulian Dinu
相关产品推荐
相关产品推荐

