Доступ к объектам json с использованием переменных в качестве ключей в postgresql

Sunil Garg спросил: 28 марта 2018 в 03:00 в: sql

У меня есть json poll_result

{"total_votes":1,"yes":1,"no":0}

, и у меня есть переменная с ключом

vote_to = _poll_response::json#>>'{vote}';

и который возвращает "yes".

Теперь я хочу получить доступ к poll_result json на основе значения переменной vote_to, поэтому я пытаюсь

raise notice '%',poll_result::json#>>'{||vote_to||}';

, но это печать <NULL>. Даже я пробовал как

raise notice '%,%',poll_result,poll_result::json#>>'{''||vote_to||''}';

, но результат такой же <NULL>.

Пожалуйста, помогите !!!

1 ответ

Есть решение
klin ответил: 28 марта 2018 в 04:21

Смотрите пример того, как использовать переменную с операторами ->> и #>>:

do $$
declare
    pool_result json = '{"total_votes":1,"yes":1,"no":0}';
    vote_to text = 'yes';
begin
    raise notice 'yes: %', pool_result ->> vote_to;
    -- or
    raise notice 'yes: %', pool_result #>> array[vote_to]; 
end;
$$NOTICE:  yes: 1
NOTICE:  yes: 1

Если значение переменная в двойных кавычках, вы должны обрезать их:

do $$
declare
    pool_result json = '{"total_votes":1,"yes":1,"no":0}';
    vote_to text = '"yes"';
begin
    raise notice 'yes: %', pool_result ->> trim(vote_to, '"');
    -- or
    raise notice 'yes: %', pool_result #>> array[trim(vote_to, '"')]; 
end;
$$
Sunil Garg ответил: 28 марта 2018 в 04:12
не работает .. raise notice '%,%',vote_to,poll_result::json #>> array[vote_to]; печатает NOTICE: "yes",<NULL>
Sunil Garg ответил: 28 марта 2018 в 04:27
да!! это работает .. poll_result из таблицы базы данных, тип которой является json. Тогда зачем мне обрезать