Il n'y a pas de jsonb
intégré opérateurs ni aucun index supportant directement (encore) ce type de filtre.
Je suggère un EXISTS
semi-jointure :
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Il évite les évaluations redondantes et le DISTINCT
final étape dont vous auriez besoin pour obtenir des lignes distinctes avec un simple CROSS JOIN
.
Si cela n'est toujours pas assez rapide, une solution spécialisée plus sophistiquée pour le type de requête donné consisterait à extraire une chaîne concaténée de valeurs uniques (avec un délimiteur qui n'interférera pas avec vos modèles de recherche) par ligne dans un IMMUTABLE
fonction, créez un index trigramme GIN sur l'expression fonctionnelle et utilisez la même expression dans vos requêtes.
Connexe :
- Rechercher des valeurs imbriquées dans un tableau jsonb avec un opérateur supérieur
- Rechercher des lignes contenant une clé dans un tableau JSONB d'enregistrements
- Créer un index JSONB Postgres sur un sous-objet de tableau
De plus, si votre jsonb
les valeurs ressemblent vraiment à l'exemple, vous pouvez supprimer beaucoup de bruit et simplement stocker :
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]