web-dev-qa-db-fra.com

Comment interroger des champs dans le nouveau type de données PostgreSQL JSON?

Je recherche des documents et/ou des exemples pour les nouvelles fonctions JSON dans PostgreSQL 9.2.

Spécifiquement, étant donné une série d’enregistrements JSON:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]

Comment pourrais-je écrire le code SQL pour trouver un enregistrement par son nom?

Dans Vanilla SQL:

SELECT * from json_data WHERE "name" = "Toby"

Le manuel de développement officiel est assez rare:

Mise à jour I

J'ai mis en place un Gist détaillant ce qui est actuellement possible avec PostgreSQL 9.2 . En utilisant certaines fonctions personnalisées, il est possible de faire des choses comme:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';

Mise à jour II

J'ai maintenant déplacé mes fonctions JSON dans leur propre projet:

PostSQL - un ensemble de fonctions permettant de transformer PostgreSQL et PL/v8 en un magasin de documents JSON totalement génial

203
Toby Hede

Postgres 9.2

Je cite Andrew Dunstan sur la liste de pgsql-hackers :

À un moment donné, il y aura éventuellement des fonctions de traitement JSON (par opposition à celles produisant JSON), mais pas dans 9.2.

Cela ne l’empêche pas de fournir un exemple d’implémentation dans PLV8 qui devrait résoudre votre problème.

Postgres 9.3

Offre un arsenal de nouvelles fonctions et opérateurs pour ajouter "json-processing".

La réponse à la question originale dans Postgres 9.3:

SELECT *
FROM   json_array_elements(
  '[{"name": "Toby", "occupation": "Software Engineer"},
    {"name": "Zaphod", "occupation": "Galactic President"} ]'
  ) AS elem
WHERE elem->>'name' = 'Toby';

Exemple avancé:

Pour les tables plus volumineuses, vous pouvez ajouter un index d'expression pour améliorer les performances:

Postgres 9.4

Ajoute jsonb (b pour "binaire", les valeurs sont stockées sous forme de types Postgres natifs) et encore plus de fonctionnalités pour les types deux. En plus des index d'expression mentionnés ci-dessus, jsonb prend également en charge index GIN, btree et hachage , GIN étant le plus puissant de ceux-ci.

Le manuel va jusqu'à suggérer:

En général, , la plupart des applications préfèrent stocker les données JSON sous la forme jsonb, à moins qu'il existe des besoins assez spécialisés, tels que des hypothèses héritées concernant la commande des clés d'objet.

Gras accent mien.

Les performances bénéficient des améliorations générales apportées aux index GIN.

Postgres 9.5

Complétez les fonctions et opérateurs jsonb. Ajoutez plus de fonctions pour manipuler jsonb à la place et pour l’affichage.

170

Avec Postgres 9.3+, utilisez simplement l'opérateur ->. Par exemple,

SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;

voir http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ pour quelques exemples de Nice et un tutoriel.

82
Meekohi

Avec postgres 9.3, utilisez -> pour accéder aux objets. 4 exemple

seed.rb

se = SmartElement.new
se.data = 
{
    params:
    [
        {
            type: 1,
            code: 1,
            value: 2012,
            description: 'year of producction'
        },
        {
            type: 1,
            code: 2,
            value: 30,
            description: 'length'
        }
    ]
}

se.save

Rails c

SELECT data->'params'->0 as data FROM smart_elements;

résultats

                                 data
----------------------------------------------------------------------
 {"type":1,"code":1,"value":2012,"description":"year of producction"}
(1 row)

Vous pouvez continuer la nidification

SELECT data->'params'->0->'type' as data FROM smart_elements;

revenir

 data
------
 1
(1 row)
17