Er zijn geen ingebouwde jsonb
operators noch enige indexen die dit soort filter (nog) rechtstreeks ondersteunen.
Ik stel voor een EXISTS
semi-join:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Het vermijdt overbodige evaluaties en de uiteindelijke DISTINCT
stap zou je verschillende rijen moeten krijgen met een duidelijke CROSS JOIN
.
Als dit nog steeds niet snel genoeg is, is een veel geavanceerdere gespecialiseerde oplossing voor het gegeven type zoekopdracht het extraheren van een aaneengeschakelde reeks unieke waarden (met een scheidingsteken dat uw zoekpatronen niet verstoort) per rij in een IMMUTABLE
functie, bouw een trigram GIN-index op de functionele uitdrukking en gebruik dezelfde uitdrukking in uw zoekopdrachten.
Gerelateerd:
- Zoeken naar geneste waarden in jsonb-array met grotere operator
- Zoek rijen met een sleutel in een JSONB-array met records
- Maak Postgres JSONB-index op array-subobject
Terzijde, als uw jsonb
waarden lijken echt op het voorbeeld, je zou veel ruis kunnen weghalen en gewoon opslaan:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]