更新PostgreSQL中的json列表类型列

时间:2015-07-10 09:21:51

标签: python json postgresql sql-update

我有一个名为' 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_jsonjson_array_elements

我写了这个查询:

update tbl
set attr = json_build_array(json_array_elements(attr), '{"foo":4}'::json);

但结果错了。

1 个答案:

答案 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子句。

不要在子选择中第二次转到基础表,只需使用目标行中的值。