python
  • json
  • postgresql
  • sql-update
  • 2015-07-10 52 views 1 likes 
    1

    我得到了一个名为'attr'的json类型列,用于存储列表,包括一些字典,如[{"foo":1}, {"foo":2}, {"foo":3}]更新PostgreSQL中的json列表类型列

    现在我想将列表扩展到[{"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

    对于数据类型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子句。

    不要在子查询中第二次进入基础表,只需使用来自目标行的值。

    +0

    感谢您的回答!它帮助我很多! – PikeSZfish

    相关问题