Je moet de arrays op het hoogste niveau uit elkaar halen en de elementen vanaf daar controleren:
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;
Wat de beste manier is om dit te doen, dat hangt sterk af van uw werkelijke gegevens - hoeveel rijen, hoe groot deze jsonb-structuren zijn, enz. In het algemeen zal een zoekopdracht zoals ilike '%3%' echter profiteren van op indexen gebaseerde off van pg_trgm omdat ze geen traditionele btree-indexen kunnen gebruiken.
Bewerken:de vraag van @Abelisto in de opmerkingen is beter omdat deze beter zou moeten presteren, vooral als de inhoud duizenden elementen kan bevatten:
select * from test
where exists
(select 1
from jsonb_array_elements(content) jae(elems)
where elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
);