предположим, у меня есть стол
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, пока не будет стабильной версии.