You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:10:43