Det finns inga inbyggda jsonb operatorer eller några index som stöder denna typ av filter direkt (ännu).
Jag föreslår en EXISTS semi-join:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Den undviker redundanta utvärderingar och den slutliga DISTINCT steg du skulle behöva för att få distinkta rader med en vanlig CROSS JOIN .
Om detta fortfarande inte är tillräckligt snabbt, skulle en mer sofistikerad, specialiserad lösning för den givna typen av fråga vara att extrahera en sammanfogad sträng av unika värden (med en avgränsare som inte stör dina sökmönster) per rad i en IMMUTABLE funktion, bygg ett trigram GIN-index på det funktionella uttrycket och använd samma uttryck i dina frågor.
Relaterat:
- Sök efter kapslade värden i jsonb-arrayen med större operator
- Hitta rader som innehåller en nyckel i en JSONB-uppsättning av poster
- Skapa Postgres JSONB Index på Array Sub-Object
Bortsett från, om din jsonb värden verkligen ser ut som exemplet, du kan trimma mycket brus och bara lagra:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]