Изменить поля JSONB внутри postgres

предположим, у меня есть стол

CREATE TABLE test (id integer NOT NULL, categories jsonb)

и у меня есть следующий элемент:

insert into test (categories) values ('{"foo": 1, "bar": 5}');

Я хотел бы создать функцию, которая принимает массив строк. Если строка была найдена в JSON, то она должна +1 к своему значению, если нет, она должна добавить ее со значением = 1.

Я создал заглушку своей функции, которая выглядит так:

CREATE OR REPLACE FUNCTION update_json(varchar[]) RETURNS void AS $$
DECLARE
  key varchar;
  my_json jsonb := '{"foo": 5, "baz": 10}'::jsonb; -- for testing purposes, I am using static json here.
BEGIN
  -- FINISH FOLLOWING LOOP
  FOREACH key IN ARRAY $1 LOOP
    IF my_json->key IS NULL THEN
      RAISE NOTICE 'json = %', my_json->key;
      my_json->key := 1;
    ELSE
      my_json->key += 1;
    END IF;
  END LOOP;

  RAISE NOTICE 'json = %', my_json;
  -- UPDATE test SET categories = my_json WHERE id = 1;
END;
$$ LANGUAGE plpgsql;


SELECT update_json(ARRAY['foo', 'bar']);

Я ожидаю, что my_json в конце будет: {"foo": 2, "bar": 1, "baz": 10}

Я был бы очень признателен, если бы кто-нибудь помог мне заставить эту функцию работать.

PS: Я использую Postgres 9.4, и я не могу использовать 9.5, пока не будет стабильной версии.


person user1105595    schedule 29.10.2015    source источник
comment
Это возможно с помощью простого SQL, из PostgreSQL 9.3+ (скоро я обновлю этот ответ, чтобы также упомянуть новые функции 9.5).   -  person pozs    schedule 29.10.2015


Ответы (1)


Существует расширение jsonbx, которое поддерживает некоторые функции и операторы json(b) с 9.5 по 9.4 (в частности, jsonb_set, который вас интересует).

Взгляните на: http://www.pgxn.org/dist/jsonbx/1.0 .0/

person Radek Postołowicz    schedule 29.10.2015