web-dev-qa-db-fra.com

Est-il possible de sélectionner des valeurs distinctes dans un document json en utilisant PostgreSQL?

J'ai une colonne qui utilise le type JSON. Je voudrais effectuer une requête pour sélectionner tous les enregistrements distincts pour un champ particulier dans la chaîne JSON: I.e. étant donné ces trois documents

{
  id: 1,
  s: "foo"
},
{
  id:2,
  s: "bar"
},
{
  id:3,
  s: "foo"
},

la requête doit vérifier la clé "s" pour des valeurs distinctes et renvoyer les documents avec l'ID 1 et 2.

6

En supposant un tableau JSON dans un Postgres 9.4 jsonb colonne, cela ferait le travail:

SELECT DISTINCT ON (doc->'s') doc
FROM  (
   SELECT '[
    {
      "id":1,
      "s":"foo"
    },
    {
      "id":2,
      "s":"bar"
    },
    {
      "id":3,
      "s":"foo"
    }]'::jsonb AS j
   ) t
   , jsonb_array_elements(t.j) WITH ORDINALITY t1(doc, rn)
ORDER  BY doc->'s', rn;

Ou, à moins que s ne soit un objet imbriqué, il est probablement moins cher de se replier sur la text valeur au lieu de la jsonb (sous-) record. Utilisez simplement opérateur ->> Au lieu de -> dans ce cas. Le résultat est le même:

 doc
----------------------
'{"s": "bar", "id": 2}'
'{"s": "foo", "id": 1}'

Remplacez la sous-requête t par votre table actuelle.

Les éléments clés sont jsonb_array_elements() (ou json_array_elements()) dans une LATERAL jointure avec WITH ORDINALITY Puis la spécificité Postgres DISTINCT ON.

Connexes, avec plus d'explications:

11