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

Pourquoi ne puis-je pas interroger directement sur jsonb_array_elements ?

Comme le message d'erreur l'indique, les arguments de WHERE ne doit pas retourner un ensemble. jsonb_array_elements renvoie un ensemble et il ne peut pas être comparé à une seule valeur. Dans la deuxième requête, vous avez une jointure croisée à l'intérieur de la sélection et qui la convertit en un résultat approprié pour utiliser WHERE sur.

Vous pouvez également le faire de cette façon

SELECT mydata.pk FROM mydata
  WHERE 'Bob' in (SELECT jsonb_array_elements(mydata.data->'people')->>'name');

Ici, la sous-sélection vous permettra d'utiliser le IN opérateur pour trouver la valeur désirée puisque le résultat n'est plus un ensemble.

Une autre façon est d'interroger directement le jsonb

SELECT mydata.pk FROM mydata
  WHERE mydata.data->'people' @> '[{"name":"Bob"}]'::jsonb;

De cette façon, vous n'avez pas besoin de convertir le jsonb en un jeu de résultats et d'y effectuer une recherche.