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:
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%';
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
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.
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:
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.
json
ET jsonb
et fonctions .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.
Complétez les fonctions et opérateurs jsonb
. Ajoutez plus de fonctions pour manipuler jsonb
à la place et pour l’affichage.
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.
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)