Как обновить значение JSONB, если ключ пути находится в переменной postgresql - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть поле JSONB в таблице. Я хочу обновить значение отдельного ключа, поэтому я использую метод jsonb_set. Ключ, который я хочу обновить, находится в переменной.

Вот объект jsonb, который я хочу обновить

{"yes":5,"total_votes":6,"no":1}

и переменная ключа vote_to равна yes.

Вот как я пытаюсь

update polls set result = jsonb_set(result, ('{'||vote_to||'}'),vote_count::text::jsonb) where id=_poll_id;

И ошибка

ERROR:  function jsonb_set(jsonb, text, jsonb) does not exist
LINE 1: update polls set result = jsonb_set(result, ('{'||vote_to||'...
                                  ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

А как мне обновить два ключа за один снимок? А также vote_count является целым числом, поэтому мне нужно его двойное приведение, чтобы сделать jsonb

vote_count::text::jsonb

Есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 20 ноября 2018

Согласно документации PostgreSQL подпись функции jsonb_set равна jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]). Таким образом, вы должны привести второй аргумент к text[].

Используя это:

CREATE TABLE polls (id INTEGER, result jsonb, vote_count jsonb);
INSERT INTO polls VALUES (1, '{"yes":5,"total_votes":6,"no":1}'::jsonb, '{"v": 1}'::jsonb);
CREATE OR REPLACE FUNCTION test(poll_id INTEGER, vote_to TEXT) RETURNS VOID AS 
$$
DECLARE
    to_update jsonb;
BEGIN
    update polls set result = jsonb_set(result, ('{'||vote_to||'}')::text[], vote_count) where id=poll_id;
END;
$$ LANGUAGE plpgsql;
SELECT test(1, 'yes');

Вы получите следующий результат для SELECT * FROM polls;:

 id |                    result                    | vote_count
----+----------------------------------------------+------------
  1 | {"no": 1, "yes": {"v": 1}, "total_votes": 6} | {"v": 1}
(1 row)
...