Nie ma wbudowanego jsonb operatorów ani żadnych indeksów bezpośrednio obsługujących ten rodzaj filtra (jeszcze).
Proponuję EXISTS półzłącze:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Unika zbędnych ocen i końcowego DISTINCT krok, który potrzebujesz, aby uzyskać różne wiersze ze zwykłym CROSS JOIN .
Jeśli to nadal nie jest wystarczająco szybkie, o wiele bardziej wyrafinowanym wyspecjalizowanym rozwiązaniem dla danego typu zapytania byłoby wyodrębnienie połączonego ciągu unikalnych wartości (z ogranicznikiem, który nie będzie kolidował z wzorcami wyszukiwania) na wiersz w IMMUTABLE funkcji, zbuduj indeks GIN trygramu na wyrażeniu funkcjonalnym i użyj tego samego wyrażenia w swoich zapytaniach.
Powiązane:
- Wyszukaj zagnieżdżone wartości w tablicy jsonb z większym operatorem
- Znajdź wiersze zawierające klucz w tablicy rekordów JSONB
- Utwórz indeks Postgres JSONB dla podobiektu tablicy
Poza tym, jeśli twój jsonb wartości naprawdę wyglądają jak w przykładzie, możesz przyciąć dużo szumu i po prostu zapisać:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]