Comment puis-je interroger les champs à l'intérieur du nouveau datatype JSON PostgreSQL?
je cherche des docs et/ou des exemples pour les nouvelles fonctions JSON dans PostgreSQL 9.2.
spécifiquement, étant donné une série de dossiers JSON:
[
{name: "Toby", occupation: "Software Engineer"},
{name: "Zaphod", occupation: "Galactic President"}
]
Comment écrire le SQL pour trouver un enregistrement par son nom?
À la vanille SQL:
SELECT * from json_data WHERE "name" = "Toby"
L'officiel dev manuel est assez clairsemée:
- http://www.postgresql.org/docs/devel/static/datatype-json.html
- http://www.postgresql.org/docs/devel/static/functions-json.html
Mise À Jour Je
j'ai assemblé 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 transféré mes fonctions JSON 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
3 réponses
Postgres 9.2
je cite Andrew Dunstan sur la liste pgsql-hackers :
à un moment donné, il y aura peut-être un traitement json (par opposition à un traitement json). pour les fonctions de production json), mais pas dans 9.2.
ne l'empêche pas de fournir un exemple d'implémentation en PLV8 qui devrait résoudre votre problème.
Postgres 9.3
Propose un arsenal de nouvelles fonctions et opérateurs pour ajouter "json-traitement".
- Le manuel sur les nouveaux JSON fonctionnalité.
- La Postgres Wiki sur les nouvelles fonctionnalités de pg 9.3 .
- @ will a posté un lien vers un blog montrant les nouveaux opérateurs dans a commentaires ci-dessous .
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';
exemple avancé:
pour les tables plus grandes, Vous pouvez ajouter un indice d'expression pour augmenter la performance:
Postgres 9.4
, Ajoute jsonb
(b pour "binaire", les valeurs sont stockées en tant que natif de Postgres types) et encore plus de fonctionnalités pour les deux . En plus des index d'expression mentionnés ci-dessus, jsonb
supporte aussi index de gin, btree et hash , le GIN étant le plus puissant de ils.
Le manuel va jusqu'à suggérer:
en général, la plupart des applications devraient préférer stocker des données JSON comme
jsonb
, à moins qu'il n'y ait des besoins tout à fait spécialisés, tels que l'héritage hypothèses sur la commande des clés d'objet.
le Gras c'est moi qui souligne.
avantages de Performance d'améliorations générales de GIN index.
Postgres 9.5
Complet jsonb
de fonctions et d'opérateurs. Ajouter plus de fonctions pour manipuler jsonb
en place et pour l'affichage.
avec Postgres 9.3+, il suffit d'utiliser 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 beaux exemples et un tutoriel.
Avec postgresql 9.3 utilisation -> pour l'accès aux objets. 4 Exemple
de la graine.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;
retourne
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;
retour
data
------
1
(1 row)