You need to enable JavaScript to run this app. PostgreSQL中如何编写f_all函数合并多子函数结果为单个JSONB对象
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何编写f_all函数合并多子函数结果为单个JSONB对象

实现方案

核心改动是用PostgreSQL原生的jsonb合并运算符||替代数组追加操作,不需要改动原有遍历执行子函数的核心流程,调整3处逻辑即可达到需求:

核心逻辑说明

PostgreSQL中jsonb类型支持||运算符,可直接合并两个jsonb对象,新增的键值对会自动追加到原有对象中,完全符合你每轮循环追加键值对的需求。

改后完整代码

CREATE OR REPLACE FUNCTION f_all(ingeom geometry, parts text)
 RETURNS jsonb -- 改返回值为单个jsonb对象,而非jsonb数组
 LANGUAGE plpgsql
AS $function$
DECLARE 
    arr TEXT ARRAY;
    i text;
    json_partx jsonb;
    resultjson jsonb := '{}'::jsonb; -- 初始化空jsonb对象,而非数组
 BEGIN
    arr = string_to_array(parts, ',');
    
    FOREACH i in ARRAY arr
    LOOP
        EXECUTE 'SELECT f_' || i || '($1)' into json_partx using ingeom;
        -- 用||运算符合并新键值对到现有json对象,替代array_append
        resultjson := resultjson || jsonb_build_object('part' || i, json_partx);
    END LOOP;
        
    RETURN resultjson;
END;
$function$;

可选安全优化

如果要避免非法parts参数导致的SQL注入风险,可以在循环中添加序号校验逻辑:

FOREACH i in ARRAY arr
LOOP
    -- 新增序号格式校验
    IF i !~ '^[0-9]+$' THEN
        RAISE EXCEPTION '非法的部件序号: %', i;
    END IF;
    EXECUTE 'SELECT f_' || i || '($1)' into json_partx using ingeom;
    resultjson := resultjson || jsonb_build_object('part' || i, json_partx);
END LOOP;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 21:27:03