Ответ 1
Можно рекурсивно пройти через неизвестную структуру JSON, но это будет довольно сложно и дорого. Я бы предложил метод грубой силы, который должен хорошо работать:
select *
from reports
where params::text like '%authVar%';
-- or
-- where params::text like '%"authVar"%';
-- if you are looking for the exact value
Запрос очень быстрый, но может возвращать неожиданные дополнительные строки в тех случаях, когда искомая строка является частью одного из ключей.
В Postgres 12 рекурсивный поиск в JSONB довольно удобен с новой функцией jsonpath
.
Найдите строковое значение, содержащее authVar:
select *
from reports
where jsonb_path_exists(params, '$.** ? (@.type() == "string" && @ like_regex "authVar")')
Jsonpath:
$.** find any value at any level (recursive processing)
? where
@.type() == "string" value is string
&& and
@ like_regex "authVar" value contains 'authVar'
Или найдите точное значение:
select *
from reports
where jsonb_path_exists(params, '$.** ? (@ == "authVar")')
Прочтите в документации: