Эти вложенные массивы внутри структуры действительно затрудняют поиск.В результате вам нужно дважды развернуть структуру, чтобы получить доступ к отдельным значениям.
select e.*
from employee e
where exists (select *
from jsonb_array_elements(e.json_data #> '{data}') as x1(data)
cross join lateral jsonb_array_elements(x1.data -> 'b') as x2(b)
where x2.b ->> 'val' like 'Ind%');
Вызов jsonb_array_elements()
возвращает все элементы массива массива верхнего уровня в виде строк.Для каждой строки все пары ключ / значение в ключе 'b'
снова извлекаются как строки.Затем этот результат можно искать с условием LIKE
.
Онлайн пример: https://rextester.com/FCUJU88109
Вы можете увидеть, что делает подвыбор, запустив:
select e.id, x1.data, x2.b
from employee e
cross join lateral jsonb_array_elements(e.json_data #> '{data}') as x1(data)
cross join lateral jsonb_array_elements(x1.data -> 'b') as x2(b);