Няма вграден jsonb
оператори, нито индекси, поддържащи този вид филтър директно (все още).
Предлагам EXISTS
полусъединяване:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Той избягва излишните оценки и крайния DISTINCT
стъпка ще трябва да получите отделни редове с обикновен CROSS JOIN
.
Ако това все още не е достатъчно бързо, по-сложно специализирано решение за дадения тип заявка би било да се извлече конкатениран низ от уникални стойности (с разделител, който няма да пречи на вашите модели за търсене) на ред в IMMUTABLE
функция, изградете триграма GIN индекс върху функционалния израз и използвайте същия израз във вашите заявки.
Свързано:
- Търсете вложени стойности в jsonb масив с по-голям оператор
- Намерете редове, съдържащи ключ в JSONB масив от записи
- Създайте Postgres JSONB индекс върху подобект на масив
Освен това, ако вашият jsonb
стойностите наистина изглеждат като примера, можете да отрежете много шум и просто да съхраните:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]