Měli byste rozdělit pole nejvyšší úrovně a zkontrolovat prvky odtud:
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;
Pokud jde o nejlepší způsob, jak toho dosáhnout, závisí to hodně na vašich skutečných datech – kolik řádků, jak velké jsou tyto struktury jsonb atd. Obecně však platí, že vyhledávání jako ilike „%3%“ bude těžit z indexů založených z pg_trgm, protože nemohou používat tradiční indexy btree.
Edit:Dotaz @Abelisto v komentářích je lepší, protože by měl být výkonnější, zvláště pokud obsah může obsahovat 1000 prvků:
select * from test
where exists
(select 1
from jsonb_array_elements(content) jae(elems)
where elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
);