python
  • json
  • postgresql
  • sql-update
  • 2015-07-10 49 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

    相關問題