PostgreSQL函数迭代拼接JSONB时如何去除开头空JSON对象?
解决PostgreSQL函数返回JSON数组开头空对象的问题
问题出在你初始化val为'{}'::json(空JSON对象),后续拼接时这个空对象会被保留在最终数组里,导致结果开头多了个多余的空对象。
下面提供两种解决方法:
方法一:修正初始化与拼接逻辑
把val初始化为空JSON数组,循环中逐个将有效结果添加到数组中:
CREATE OR REPLACE FUNCTION myWrapperFunction() RETURNS SETOF json LANGUAGE 'plpgsql' COST 100 STABLE STRICT ROWS 1000 AS $BODY$ DECLARE _elements INTEGER[]; _element INTEGER; _results json; val jsonb = '[]'::jsonb; -- 初始化为空数组,而非空对象 BEGIN SELECT ARRAY_AGG(DISTINCT column1) INTO _elements FROM table1; FOREACH _element IN ARRAY _elements LOOP SELECT * FROM myFunction(_element) INTO _results; IF _results IS NOT NULL THEN -- 将单个JSON对象包装成数组后与原数组合并 val = val || jsonb_build_array(_results::jsonb); END IF; END LOOP; RETURN QUERY SELECT val::json; END; $BODY$;
方法二:用SQL聚合替代PL/pgSQL循环(更简洁高效)
直接通过SQL聚合查询生成目标数组,避免手动循环的初始化错误:
CREATE OR REPLACE FUNCTION myWrapperFunction() RETURNS json LANGUAGE sql STABLE STRICT AS $BODY$ SELECT json_agg(result) FROM ( SELECT DISTINCT myFunction(column1) AS result FROM table1 WHERE myFunction(column1) IS NOT NULL ) sub; $BODY$;
注:如果你的函数确实需要返回
SETOF json类型,方法一的返回逻辑保持不变;方法二则可以调整返回类型为SETOF json,但此时会将整个JSON数组作为单行返回,需根据实际需求选择。
内容的提问来源于stack exchange,提问作者Monu
相关产品推荐
相关产品推荐

