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"}
]