Postgresql: agréger des objets dans un tableau (json) (problèmes de sous-requête)

8

Je suis désolé pour le titre vague, mais je ne connais tout simplement pas les bons mots pour décrire cela.

J'ai cette requête qui transforme un tas de colonnes en un objet qui fonctionne très bien:

SELECT row_to_json(t) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t

Cependant, je veux regrouper les objets qui entrent dans une certaine catégorie dans un tableau. Cette catégorie est définie par une quatrième colonne à l'intérieur de ma table nommée "cargoProductId". Le tableau doit avoir la valeur de "cargoProductId" comme clé. Donc:

"961":[ {"type":"Feature",.... {"type":"Feature",.... {"type":"Feature",.... ], "962":[ ..... ]

Donc, je me bats avec ça depuis environ une heure et demie. Je n'ai vraiment aucune idée de comment procéder. Voici ce que j'ai en ce moment:

SELECT array_agg(row_to_json(t)) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t) FROM "bgbCargoMinardJSON" GROUP BY "carProductId"

ervazu
la source

Réponses:

9

Si vous êtes sur 9.4, quelque chose comme ça pourrait être ce que vous recherchez:

select json_object(array_agg(id)::text[],array_agg(rw)::text[])
from( select id
           , ( select to_json(array_agg(row_to_json(t)))
               from (select typ,prop from bgb where id=b.id) t ) rw
      from bgb b
      group by id ) z;
Jack dit d'essayer topanswers.xyz
la source
Merci Jack! Au niveau de la formation, il a fait l'affaire! Le seul problème que j'ai, c'est qu'il ne fournit pas de json valide (enfin techniquement). Il y a ce texte en conversion json en cours comme: {"3565": "[{\"type\":j'ai une apostrophe avant chaque parenthèse et une barre oblique avant chaque apostrophe. J'avais ça avant et c'est toujours quelque chose avec le type de données. Quelle que soit la vérité à dire, je ne comprends pas complètement et comment fonctionne la requête que vous avez écrite, et donc je ne sais pas vraiment où et comment résoudre ce problème.
ervazu
Ce n'est probablement pas la meilleure solution, mais je viens d'utiliser la fonction de remplacement pour résoudre ce problème. Merci encore pour votre temps!
ervazu
1
cela a fonctionné pour mon cas:json_agg(to_json(items.*)) as "items"
ricka