PostgreSQL中列内逗号分隔值的去重拼接实现
如何在PostgreSQL中去除逗号分隔字符串里的重复值?
嘿,我发现你现在的问题是想把字段里重复的逗号分隔值去掉对吧?你原来的代码没生效,是因为直接对整个description字段用distinct根本没用——毕竟整个字符串'a,b,a'本身是唯一的,所以去重操作相当于没做。
咱们换个思路:先把字符串拆成单个值,去重之后再拼回去就好啦!下面是完整的可运行脚本:
-- 创建临时表并插入测试数据 create temporary table test ( id integer, description text ); insert into test select 1,'a,b,a'; -- 正确的查询语句:拆分→去重→拼接 select id, string_agg(distinct single_value, ',' order by single_value) as description from test, unnest(string_to_array(description, ',')) as single_value group by id;
代码分步解释:
string_to_array(description, ','):把逗号分隔的字符串转换成PostgreSQL数组,比如'a,b,a'会变成['a','b','a']unnest(...):把数组拆成单独的行记录,这样原来的1条数据会变成3条:(1, 'a'), (1, 'b'), (1, 'a')distinct single_value:对拆分后的单个值去重,剩下'a'和'b'string_agg(..., ',' order by single_value):把去重后的值重新拼成逗号分隔的字符串,加上order by还能保证输出顺序稳定(可选,但推荐)
运行之后你就能得到想要的结果:
id | description
1 | a,b
内容的提问来源于stack exchange,提问作者KAN
相关产品推荐
相关产品推荐

