如何在PostgreSQL PL/pgSQL中从string_agg查询返回单个标量
解决PostgreSQL函数返回聚合标量的问题
错误原因分析
ERROR: cannot use RETURN QUERY in a non-SETOF function:RETURN QUERY是用于返回多行结果集的语法,必须搭配RETURNS SETOF 数据类型使用,但你的函数声明返回单个标量(CHARACTER VARYING),二者不兼容。- 去掉
QUERY后报错:PL/pgSQL中RETURN语句不能直接跟SELECT语句,必须先将查询结果赋值给变量,再返回变量。
正确实现方式
方式1:PL/pgSQL函数(通过变量接收结果)
适合需要额外逻辑处理的场景:
CREATE OR REPLACE FUNCTION func_names() RETURNS CHARACTER VARYING AS $$ DECLARE result_str CHARACTER VARYING; BEGIN -- 将聚合查询结果赋值给变量 SELECT string_agg(DISTINCT n.name, ',') INTO result_str FROM names n; RETURN result_str; END; $$ LANGUAGE plpgsql;
方式2:SQL函数(更简洁高效)
如果不需要复杂逻辑,直接用SQL函数更轻便:
CREATE OR REPLACE FUNCTION func_names() RETURNS CHARACTER VARYING AS $$ SELECT string_agg(DISTINCT n.name, ',') FROM names n; $$ LANGUAGE sql;
测试调用
执行以下语句即可获取聚合后的字符串:
SELECT func_names();
返回结果为:foo,bar
内容的提问来源于stack exchange,提问作者camilajenny
相关产品推荐
相关产品推荐

