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.