Es gibt kein eingebautes jsonb
Operatoren noch irgendwelche Indizes, die diese Art von Filter (noch) direkt unterstützen.
Ich schlage ein EXISTS
vor Semi-Join:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Es vermeidet redundante Auswertungen und das abschließende DISTINCT
Schritt müssten Sie eindeutige Zeilen mit einem einfachen CROSS JOIN
erhalten .
Wenn dies immer noch nicht schnell genug ist, wäre eine viel ausgefeiltere spezialisierte Lösung für den gegebenen Abfragetyp das Extrahieren einer verketteten Zeichenfolge eindeutiger Werte (mit einem Trennzeichen, das Ihre Suchmuster nicht stört) pro Zeile in einem IMMUTABLE
Funktion, erstellen Sie einen Trigramm-GIN-Index auf dem funktionalen Ausdruck und verwenden Sie denselben Ausdruck in Ihren Abfragen.
Verwandte:
- Suche nach verschachtelten Werten im jsonb-Array mit größerem Operator
- Suchen Sie Zeilen, die einen Schlüssel in einem JSONB-Array von Datensätzen enthalten
- Postgres-JSONB-Index für Array-Unterobjekt erstellen
Abgesehen davon, wenn Ihr jsonb
Werte wirklich wie im Beispiel aussehen, könnten Sie viel Rauschen trimmen und einfach speichern:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]