修改postgres

时间:2015-10-29 09:16:50

标签: postgresql postgresql-9.4 jsonb

假设我有一张桌子

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。

1 个答案:

答案 0 :(得分:0)

有jsonbx扩展,它将一些json(b)函数和运算符从9.5扩展到9.4(特别是你感兴趣的jsonb_set)。

查看:http://www.pgxn.org/dist/jsonbx/1.0.0/