Interrogez json_array dans les clauses where par clé et valeur

2020-06-02 sql postgresql where-clause

J'ai une requête de sélection qui me renvoie un objet array_to_json. Je veux filtrer les résultats de la sélection en fonction des clés et des valeurs spécifiques.

Voici ma requête actuelle:

select jsonarray
from (
         SELECT body.id_user,
                array_to_json(array_agg(row_to_json(body))) as jsonarray
         FROM (
                  SELECT  id_user, name, value
                  FROM table_1
                  group by id_user, name, value
              ) body
         group by body.id_user
     ) as test;

Il retourne beaucoup de lignes comme ceci:

[{"id_user": 1489, "name": "name 1", "value": "value aaaaaa"},  {"id_user": 1489, "name": "name 2", "value": "value babababab"}]

[{ "id_user": 1490, "name": "name 12", "value": "value aaaaaa"  }, { "id_user": 1490, "name": "name 2",  "value": "value babababab" }]

[ { "id_user": 1491, "name": "name 13", "value": "value aaaaaa"  }, { "id_user": 1491,  "name": "name 23",  "value": "value uouououo" }]

Eh bien, je veux seulement les lignes qui ont les champs "nom": "nom 2", "valeur": "valeur babababab" dans le json ... J'ai essayé

select jsonarray->'name'
from (
....
     ) as test
where jsonarray->>'name'::text = 'name 2';

mais cela ne renvoie rien. Il y a une autre façon de l'interroger?

Answers

Vous pouvez vérifier si le name 2 est présent lors de l'agrégation:

SELECT jsonb_agg(to_jsonb(body)) as jsonarray
FROM (
  SELECT DISTINCT id_user, name, value
  FROM table_1
) body
group by body.id_user
having bool_or(name = 'name 2') -- those with at least one `name = 'name 2'`

Exemple en ligne

Related