簡體   English   中英

在 PostgreSQL 9.5+ 中追加(推送)和從 JSON 數組中刪除

[英]Appending (pushing) and removing from a JSON array in PostgreSQL 9.5+

對於低於 9.5 的版本,請參閱此問題

我使用以下方法在 PostgreSQL 中創建了一個表:

CREATE TEMP TABLE jsontesting
AS
  SELECT id, jsondata::jsonb FROM ( VALUES
    (1, '["abra","value","mango", "apple", "sample"]'),
    (2, '["japan","china","india", "russia", "australia"]'),
    (3, '["must", "match"]'),
    (4, '["abra","value","true", "apple", "sample"]'),
    (5, '["abra","false","mango", "apple", "sample"]'),
    (6, '["string","value","mango", "apple", "sample"]'),
    (7, '["must", "watch"]')
  ) AS t(id,jsondata);

現在我想要的是

  • addappend_to_json_array這樣的東西接受實際的 jsondata,它是一個 json-array 和我必須添加到該 jsondata 數組的 newString,這個函數應該返回更新的 json-array。

     UPDATE jsontesting SET jsondata=append_to_json_array(jsondata, 'newString') WHERE id = 7;
  • 從 json 數據數組中刪除一個值,一個用於刪除該值的函數。

我試圖搜索 PostgreSQL 的文檔,但在那里什么也沒找到。

要添加值,請使用 JSON 數組附加運算符 ( || )

UPDATE jsontesting
SET jsondata = jsondata || '["newString"]'::jsonb
WHERE id = 7;

刪除值看起來像這樣

UPDATE jsontesting
SET jsondata = jsondata - 'newString'
WHERE id = 7; 

連接到嵌套字段看起來像這樣

UPDATE jsontesting
SET jsondata = jsonb_set(
  jsondata::jsonb,
  array['nestedfield'],
  (jsondata->'nestedfield')::jsonb || '["newString"]'::jsonb) 
WHERE id = 7;

要添加到 Evan Carroll 的答案,您可能需要執行以下操作以將列設置為空數組(如果它是NULL )。 如果列當前為NULL ,則附加運算符 ( || ) 不執行任何操作。

UPDATE jsontesting SET jsondata = (
    CASE
        WHEN jsondata IS NULL THEN '[]'::JSONB
        ELSE jsondata
    END
) || '["newString"]'::JSONB WHERE id = 7;

我在使用新的鍵值對附加到 postgres 中現有的 json 數據時遇到了類似的問題。 我能夠使用附加運算符||來解決這個問題如下:

UPDATE jsontesting
SET jsondata = jsondata::jsonb || '{"add_new_data": true}'
WHERE id = 7;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM