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

Postgres中json_build_array()内使用FOR循环出现语法错误

解决Postgres中JSON数组生成的语法错误问题

你遇到的语法错误是因为不能在普通SQL语句的json_build_array()中直接使用PL/pgSQL的for循环语法——for循环属于过程式的PL/pgSQL语法,只能在存储函数/过程内部使用,无法嵌入到纯SQL的函数调用中。

要生成包含多个指定结构元素的JSON数组,有两种适配场景的解决方案:

方案1:纯SQL语句实现(适合你的当前代码场景)

使用jsonb_agg()聚合函数配合子查询,替代循环生成数组元素:

select jsonb_build_object(
    'start', jsonb_build_object(
        'inv', (
            -- 子查询中生成每个JSON对象,再用jsonb_agg聚合成数组
            select jsonb_agg(jsonb_build_object('key1', 'value1', 'id', i))
            from generate_series(1,5) as t(i)
        )
    )
);

这里generate_series(1,5)生成1到5的序列,每个i对应一个jsonb_build_object生成的对象,最后通过jsonb_agg将所有对象聚合为一个JSON数组。

方案2:PL/pgSQL函数内实现(如果是在存储函数中开发)

如果你的代码是写在PL/pgSQL存储函数里,可以先通过循环构建数组变量,再嵌入到最终的JSON结构中:

create or replace function generate_custom_json() returns jsonb as $$
declare
    inv_elements jsonb[];
    i integer;
begin
    -- 循环生成每个JSON对象,存入数组变量
    for i in 1..5 loop
        inv_elements := inv_elements || jsonb_build_object('key1', 'value1', 'id', i);
    end loop;

    -- 组装最终的JSON结构
    return jsonb_build_object(
        'start', jsonb_build_object(
            'inv', to_jsonb(inv_elements)
        )
    );
end;
$$ language plpgsql;

调用函数即可得到结果:

select generate_custom_json();

内容的提问来源于stack exchange,提问作者user2529660

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:04:58