Добавление (нажатие) и удаление из массива JSON в 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);

Теперь я хотел

  • добавить. Что-то вроде append_to_json_array принимает фактическую jsondata, которая представляет собой json-массив и newString, которые я должен добавить в этот массив jsondata, и эта функция должна возвращать обновленный json-массив,

    UPDATE jsontesting
    SET jsondata=append_to_json_array(jsondata, 'newString')
    WHERE id = 7;
    
  • удалить значение из массива данных json, одну функцию для удаления значения.

Я попытался найти документацию PostgreSQL, но ничего там не нашел.

Ответ 1

Чтобы добавить значение, используйте операнд массива 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;

Ответ 2

Чтобы добавить к ответу Эвана Кэрролла, вы можете сделать следующее, чтобы установить столбец в пустой массив, если он NULL. Оператор append (||) ничего не делает, если столбец в настоящее время NULL.

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