Du bør opdele arrays på øverste niveau og kontrollere elementerne derfra:
select distinct id, content
FROM test
JOIN lateral (
select elems
FROM jsonb_array_elements(content) jae(elems)
) all_arrays ON TRUE
WHERE elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
ORDER BY 1;
Hvad angår den bedste måde at gøre dette på, afhænger det meget af dine faktiske data - hvor mange rækker, hvor store disse jsonb-strukturer er osv. Generelt vil en søgning som ilike '%3%' dog drage fordel af indeksbaserede off af pg_trgm, fordi de ikke kan bruge traditionelle btree-indekser.
Edit:@Abelistos forespørgsel i kommentarerne er bedre, fordi den burde være mere effektiv, især hvis indhold kan indeholde 1000-vis af elementer:
select * from test
where exists
(select 1
from jsonb_array_elements(content) jae(elems)
where elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
);