Вам необходимо удалить массив, чтобы иметь возможность использовать условие LIKE для каждого значения:
select h.*
from heap h
where exists (select *
from jsonb_array_elements(h.contract_product_grid -> 'contract_product_grid') as p(prod)
where p.prod ->> 'product_name' like 'Axe%')
Если вам не нужен поиск по шаблону (поэтому =
вместо LIKE
) вы можете использовать оператор содержимого @>
, который намного эффективнее:
select h.*
from heap h
where h.contract_product_grid -> 'contract_product_grid' @> '[{"product_name": "Axele"}]';
Также его можно использовать для поиска нескольких продуктов:
select h.*
from heap h
where h.contract_product_grid -> 'contract_product_grid' @> '[{"product_name": "Axele"}, {"product_name": "Bell"}]';
Если вы используете Postgres 12 , вы можете упростить этот бит, используя JSON path выражение:
select *
from heap
where jsonb_path_exists(contract_product_grid, '$.contract_product_grid[*].product_name ? (@ starts with "Axe")')
Или используя регулярное выражение:
select *
from heap
where jsonb_path_exists(contract_product_grid, '$.contract_product_grid[*].product_name ? (@ like_regex "axe.*" flag "i")')