Доступ к элементу JSONB по пути переменной - PullRequest
1 голос
/ 01 октября 2019

Мне нужно объединить два значения JSON в одно. Но расположение этих переменных является динамическим, я получаю местоположения в jsonb из базы данных.

Так что я надеялся, что смогу сделать что-то вроде этого:

select '{"a": {"b": {"c": "d"}}}'::jsonb #> '{"a","b","c"}';

Но яне могу заставить его работать с переменными, так как я не знаю, к чему приводить путь.

select '{"a": {"b": {"c": "d"}}}'::jsonb #> ('{"a","' || variable_from_database || '","c"}')::dataTypeOfJsonbPath;

Я также обнаружил, что могу использовать такой запрос:

select value#>>'{"c"}' from jsonb_each(('{"a": {"b": {"c": "d"}}}'::jsonb#>'{"a"}')) where key = 'b';

Торешит проблему извлечения значений, но теперь мне нужно объединить их в исходное значение jsonb, и в настоящее время у меня нет идей о том, как это сделать.

jsonb_set('{"a": {"b": {"c": "d"}}}'::jsonb, ('{"a","' || value2FromDatabase || '", "c"}'),
                                          (value1 || value2)::jsonb, false);

Вышеприведенный сбой для того жепричина.

Перечисление обязательных параметров для jsonb_set говорит мне, что второй параметр должен иметь тип ARRAY, но я не знаю, как привести эту строку к массиву, который сделает эту работу.

Может кто-нибудь указать мне правильное направление, как добавить одно значение к другому в объекте jsonb, где ключи обоих находятся в динамических местоположениях?

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Приведите свой путь к типу text[]

демо: db <> скрипка

SELECT
    '{"a": {"b": {"c": "d"}}}'::jsonb #> ('{"a","' || path || '","c"}')::text[]
FROM 
    mytable
1 голос
/ 01 октября 2019
select '{"a": {"b": {"c": "d"}}}'::jsonb #>> ('{"a","'||'b'||'","c"}')::text[];

Это работает, поэтому мне нужно привести к тексту []. Это работает!

...