我有一个名为' attr'的json类型列。用于存储列表的内容包括一些像[{"foo":1}, {"foo":2}, {"foo":3}]
这样的词典。
现在我想将列表扩展到[{"foo":1}, {"foo":2}, {"foo":3}, {"foo":4}]
。当然我可以使用如下的SQL查询:
update tbl
set attr='[{"foo":1}, {"foo":2}, {"foo":3}, {"foo":4}]'::json;
但是,我需要在我的网络服务器中执行它。所以我必须选择前一个值,扩展列表然后更新到表中。
我在想是否有办法使用某些postgresql函数执行此操作,例如array_to_json
或json_array_elements
我写了这个查询:
update tbl
set attr = json_build_array(json_array_elements(attr), '{"foo":4}'::json);
但结果错了。
答案 0 :(得分:1)
对于数据类型json
:
UPDATE tbl
SET attr = (
SELECT json_agg(elem)
FROM (
SELECT elem
FROM json_array_elements(attr) elem
UNION ALL
SELECT '{"foo":4}'::json
) sub
)
WHERE tbl_id = 123; -- determine row to update
对于数据类型jsonb
:
UPDATE tbl
SET attr = (
SELECT json_agg(elem)::jsonb
FROM (
SELECT elem
FROM jsonb_array_elements(attr) elem
UNION ALL
SELECT '{"foo":4}'::jsonb
) sub
)
WHERE tbl_id = 123;
汇总函数json_agg()
始终返回json
,即使在使用jsonb
输入进行调用时也是如此。所以我们需要另一个演员jsonb
。
显然,您希望将UPDATE
限制为特定行,因此请添加WHERE
子句。
不要在子选择中第二次转到基础表,只需使用目标行中的值。