Используйте переменные в качестве ключей поиска в jsonb_extract_path - PullRequest
1 голос
/ 06 октября 2019

Я работаю над событием, которое сравнивает значения jsonb в столбце между последней записью и новой записью. У меня есть другая таблица, которая определяет, какие значения сравнивать, передавая сам объект jsonb. То, с чем я работаю, выглядит примерно так:

select jsonb_extract_path(_tmp_jsonb, 'key_1', 'key2') into target;

и объект jsonb, который я смотрю внутрь, таков:

{
 "key1": {"key2": 15},
 "key3": {"key2": {"key4": 25}}
}

Теперь я могу получить 15 с помощью приведенной выше командынет проблем, но я бы хотел передавать любые комбинации клавиш в виде массива jsonb, например {"search_keys":["key3", "key2", "key4"]}. Итак, что-то вроде этого:

select jsonb_extract_path(_tmp_jsonb, ["key3", "key2", "key4"]) into target;

Более ясно, что я спрашиваю, как использовать массивы аргументов переменной длины в postgres, как вы это сделали бы в python с * args.

1 Ответ

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

Используйте оператор #> вместо функции. Правым операндом является текстовый массив.

declare
    _tmp_jsonb jsonb;
    _path text[];
    target jsonb;
begin
    _tmp_jsonb := '{"key1": {"key2": 15}, "key3": {"key2": {"key4": 25}}}';
    _path := array['key3', 'key2', 'key4'];
    target := _tmp_jsonb #> _path;
    ...

Кстати, не используйте select для простых назначений, это слишком дорого.

В Postgres 12 вы можете использовать функции пути SQL / JSON, например:

declare
    _tmp_jsonb jsonb;
    _path jsonpath; -- !!
    target jsonb;
begin
    _tmp_jsonb := '{"key1": {"key2": 15}, "key3": {"key2": {"key4": 25}}}';
    _path := '$.key3.key2.key4';
    target := jsonb_path_query(_tmp_jsonb, _path);
    ...

Новая функция является гибкой и мощной, поскольку путь json может содержать символы подстановки и поддерживает рекурсию.

Прочтите в документации:

См. Также jsonpath примерыв этот ответ.

...