Одна опция использует exists
и json(b)_array_elements()
. Если предположить, что ваша таблица называется mytable
, а столбец jsonb равен mycol
, это будет выглядеть следующим образом:
select t.*
from mytable t
where exists (
select 1
from jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'
)
В подзапросе jsonb_array_elements()
отсоедините массив json, расположенный в заданном дорожка. Затем предложение where
гарантирует, что хотя бы один элемент в массиве имеет заданный PriceID
.
Если ваши данные имеют тип данных json
, а не jsonb
, вам нужно использовать json_array_elements()
вместо jsonb_array_elements()
.
Если вы хотите отобразить некоторую информацию исходя из соответствующего элемента массива, то он другой. Вы можете использовать lateral join
вместо exists
. Имейте в виду, однако, что это будет дублировать строки, если более одного элемента массива совпадают:
select t.*, x.elt ->> 'price' price
from mytable t
cross join lateral jsonb_array_elements(t.mycol -> 'data' -> 'results') x(elt)
where x.elt ->> 'PriceID' = '8abf35ec-3e0e-466b-a4e5-2af568e90eec'