227 votes

Comment puis-je interroger en utilisant des champs dans le nouveau type de données JSON PostgreSQL?

Je suis à la recherche de certains documents et/ou des exemples pour la nouvelle JSON fonctions PostgreSQL 9.2.

Plus précisément, étant donnée une série de JSON dossiers:

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

Comment pourrais-je écrire du SQL pour rechercher un enregistrement par nom?

La vanille SQL:

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

L'officiel dev manuel est assez rares:

Mise À Jour, Je

J'ai mis en place un gist, détaillant ce qui est possible actuellement avec PostgreSQL 9.2. À l'aide de certaines des fonctions de personnalisation, 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

Maintenant, j'ai déménagé mon JSON fonctions dans leur propre projet:

PostSQL - un ensemble de fonctions pour la transformation de PostgreSQL et oracle PL/v8 dans une totalement génial document JSON magasin

186voto

Erwin Brandstetter Points 110228

Je cite Andrew Dunstan sur pgsql-hackers liste:

À un certain stade, il sera peut-être certains json-traitement (par opposition json-production) des fonctions, mais pas dans la version 9.2.

Ne pas l'empêcher de fournir un exemple de mise en œuvre dans PLV8 qui devrait résoudre votre problème.

Postgresql 9.3

... vous propose un certain nombre de nouvelles fonctions et d'opérateurs d'ajouter "json-traitement".

La réponse à la question d'origine dans Postgresql 9.3:

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

Pour les grandes tables vous pouvez ajouter un index pour améliorer les performances:
Indice Pour Trouver l'Élément dans le tableau JSON

94voto

Meekohi Points 646

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

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

19voto

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 à nicher

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

revenir

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X