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
相关产品推荐
相关产品推荐

