Powinieneś rozdzielić tablice najwyższego poziomu i sprawdzić ich elementy:
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;
Jeśli chodzi o najlepszy sposób na zrobienie tego, to zależy to w dużej mierze od Twoich rzeczywistych danych – ile wierszy, jak duże są te struktury jsonb itp. Ogólnie rzecz biorąc, wyszukiwanie takie jak „%3%” będzie korzystać z indeksów opartych na wyłączone z pg_trgm, ponieważ nie mogą używać tradycyjnych indeksów btree.
Edycja:zapytanie @Abelisto w komentarzach jest lepsze, ponieważ powinno być bardziej wydajne, zwłaszcza jeśli treść może zawierać tysiące elementów:
select * from test
where exists
(select 1
from jsonb_array_elements(content) jae(elems)
where elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
);