postgresql 函数 - 如何将新的 json 对象推送到 json 数组?

postgresql function - how to push new json object to json array?

我需要将新的 json 对象推送到现有的 json。

response json ='{"success":[{"aaa":"bbb"}]}'::json;
newitem json ='{"ccc":"ddd"}'::json;

最终回复 json 应该像下面这样

{"success":[{"aaa":"bbb"},{"ccc":"ddd"}]}

完整代码如下:

DROP FUNCTION orgname.testfunction();
CREATE OR REPLACE FUNCTION orgname.testfunction()
RETURNS json
    LANGUAGE 'plpgsql'
    VOLATILE
AS $RESPONSE$
DECLARE
    response json ='{"success":[]}'::json;
    newitem json ='{"ccc":"ddd"}'::json;  
BEGIN 
    with c(response,newitem) as (values('{"success":[{"aaa":"bbb"}]}'::json,'{"ccc":"ddd"}'::json))
, m as (select json_array_elements(response->'success') from c union all select newitem from c)
select concat('{"success":',json_agg(json_array_elements),'}')::json from m;
    return '{"expecting":"result"}'::json;
END;
$RESPONSE$

9.4 解决方案看起来不整洁。像:

t=# with c(response,newitem) as (values('{"success":[{"aaa":"bbb"}]}'::json,'{"ccc":"ddd"}'::json))
, m as (select json_array_elements(response->'success') from c union all select newitem from c)
select concat('{"success":',json_agg(json_array_elements),'}')::json from m;
                   concat
--------------------------------------------
 {"success":[{"aaa":"bbb"}, {"ccc":"ddd"}]}
(1 row)

更新

你的职能:

t=# CREATE OR REPLACE FUNCTION orgname.testfunction()
RETURNS json
    LANGUAGE 'plpgsql'
    VOLATILE
AS $RESPONSE$
DECLARE
    response json ='{"success":[{"aaa":"bbb"}]}'::json;
    newitem json ='{"ccc":"ddd"}'::json;
BEGIN
  return (with c(_response,_newitem) as (values(response,newitem))
, m as (select json_array_elements(_response->'success') from c union all select _newitem from c)
select concat('{"success":',json_agg(json_array_elements),'}')::json from m);
END;
$RESPONSE$
;
CREATE FUNCTION
t=# select * from orgname.testfunction();
                testfunction
--------------------------------------------
 {"success":[{"aaa":"bbb"}, {"ccc":"ddd"}]}
(1 row)