2015-10-29 2 views
3

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

+0

Это возможно с [простой 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

ответ

0

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

Посмотрите: http://www.pgxn.org/dist/jsonbx/1.0.0/

Смежные вопросы