Предположим, у меня есть таблицаИзменить 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, пока не получит стабильную версию.
Это возможно с [простой SQL, с PostgreSQL 9.3+] (http://stackoverflow.com/questions/18209625/how-do-i-modify-fields-inside- the-new-postgresql-json-datatype/23500670 # 23500670) (я скоро обновлю этот ответ, чтобы упомянуть и о новых функциях 9.5). – pozs