web-dev-qa-db-ja.com

PostgreSQL 9.5以降でのJSON配列の追加(プッシュ)および削除

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のようなものは、json-arrayである実際のjsondataとnewStringを受け取りますそのjsondata配列に追加する必要があり、この関数は更新されたjson-arrayを返す必要があります。

    UPDATE jsontesting
    SET jsondata=append_to_json_array(jsondata, 'newString')
    WHERE id = 7;
    
  • removejsonデータ配列の値、値を削除するための1つの関数。

PostgreSQLのドキュメントを検索しようとしましたが、何も見つかりませんでした。

22
Evan Carroll

値を追加するには、JSON配列append opperator(||

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;
49
Evan Carroll

Evan Carrollの答えに追加するには、次の手順を実行して、列がNULLである場合に空の配列に設定します。追加演算子(||)列が現在NULLである場合は何もしません。

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