PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Rechercher un tableau JSON pour un objet contenant une valeur correspondant à un modèle

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