Postgresql: agregue objetos em uma matriz (json) (problemas de subconsulta)


8

Sinto muito pelo título vago, mas simplesmente não sei as palavras certas para descrever isso.

Eu tenho essa consulta que transforma um monte de colunas em um objeto que funciona muito bem:

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

No entanto, quero agrupar os objetos que se enquadram em uma determinada categoria em uma matriz. Esta categoria é definida por uma quarta coluna dentro da minha tabela denominada "cargoProductId". A matriz deve ter o valor de "cargoProductId" como chave. Assim:

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

Então, eu tenho lutado com isso nas últimas 1 hora e meia. Eu realmente não tenho idéia de como fazer isso. Isto é o que eu tenho agora:

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

Respostas:


9

Se você está na versão 9.4, algo como isto pode ser o que você procura:

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;

Obrigado Jack! Formação sábia fez o truque! O único problema que estou tendo é que ele não fornece json válido (bem, tecnicamente, ele fornece). Há este texto para conversão json acontecendo como: {"3565": "[{\"type\":Eu tenho um apóstrofo antes de cada colchete e uma barra antes de cada apóstrofo. Eu tinha isso antes e é sempre algo com o tipo de dados. Por mais que seja verdade, não entendo completamente como funciona a consulta que você escreveu e, portanto, não sei onde e como consertar isso.
Ervazu

Esta provavelmente não é a melhor solução, mas eu apenas usei a função de substituição para corrigir isso. Mais uma vez obrigado pelo seu tempo!
Ervazu

11
isto funcionou para o meu caso:json_agg(to_json(items.*)) as "items"
ricka
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.