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)
我需要将新的 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)