PostgreSQL 12中如何为text[]数组元素添加.id后缀并拼接为指定格式文本
我来帮你搞定这个问题!你的需求可以通过两种清晰的方式实现——纯SQL查询或者改进你的PL/pgSQL函数,下面分别说明:
方法一:纯SQL查询(无需写函数)
如果只是单次处理这个数组,完全不用写函数,直接用一行SQL就能解决:
SELECT string_agg(elem || '.id', ',') AS final_result FROM unnest('{test1,test2,test3}'::text[]) AS elem;
逻辑拆解:
unnest():把你的数组拆分成单独的行元素,这样就能逐个处理每个值elem || '.id':给每个元素拼接.id后缀string_agg():把所有处理后的元素用逗号连接起来,自然就去掉了数组自带的大括号
方法二:改进你的PL/pgSQL函数
如果必须用函数封装逻辑,那需要修正原来的错误逻辑,核心是先拆分数组处理每个元素,再聚合:
CREATE OR REPLACE FUNCTION test_agg() RETURNS TEXT AS $BODY$ DECLARE test_array text[] := '{test1,test2,test3}'::text[]; -- 直接初始化数组更简洁高效 result_text text; BEGIN -- 拆分数组、处理每个元素、聚合结果一步完成 SELECT string_agg(elem || '.id', ',') INTO result_text FROM unnest(test_array) AS elem; RETURN result_text; END; $BODY$ LANGUAGE plpgsql VOLATILE;
执行SELECT test_agg();就能得到你想要的test1.id,test2.id,test3.id结果了。
原函数的问题说明:
你之前的函数里,string_agg(test_array::text, ';')是把整个数组(转成带大括号的文本)作为单个元素去聚合,自然得不到正确结果;而且逐个array_append初始化数组也没必要,直接用字面量初始化更清晰。
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

