【问题标题】:UPDATE a json list type column in PostgreSQL更新 PostgreSQL 中的 json 列表类型列
【发布时间】:2015-09-28 23:37:45
【问题描述】:

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

但它得到了错误的结果。

【问题讨论】:

    标签: python json postgresql sql-update


    【解决方案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 子句。

    不要在子选择中再次访问基础表,只需使用目标行中的值即可。

    【讨论】:

    • 感谢您的回答!对我帮助很大!
    猜你喜欢
    • 2018-05-03
    • 2019-10-14
    • 2021-06-16
    • 2016-01-19
    • 1970-01-01
    • 2012-06-12
    • 2023-02-09
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多