Трябва да разделите масивите от най-високо ниво и да проверите елементите оттам:
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;
Що се отнася до най-добрия начин да направите това, това зависи много от действителните ви данни - колко реда, колко големи са тези jsonb структури и т.н. Като цяло обаче търсене като иликато "%3%" ще се възползва от базирани на индекси от pg_trgm, защото не могат да използват традиционни btree индекси.
Редактиране:Заявката на @Abelisto в коментарите е по-добра, защото трябва да е по-ефективна, особено ако съдържанието може да съдържа 1000 елементи:
select * from test
where exists
(select 1
from jsonb_array_elements(content) jae(elems)
where elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
);