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