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.
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: