Postgresql: Agregue objetos en una matriz (json) (problemas de subconsulta)


8

Lo siento por el título vago, pero simplemente no sé las palabras correctas para describir esto.

Tengo esta consulta que transforma un montón de columnas en un objeto que funciona bien:

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

Sin embargo, quiero agrupar los objetos que caen dentro de una determinada categoría en una matriz. Esta categoría está definida por una cuarta columna dentro de mi tabla llamada "cargoProductId". La matriz debe tener el valor de "cargoProductId" como clave. Entonces:

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

Así que he estado luchando con esto durante las últimas 1 1/2 horas más o menos. Realmente no tengo idea de cómo hacer esto. Esto es lo que tengo ahora:

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

Respuestas:


9

Si estás en 9.4, algo como esto podría ser lo que buscas:

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;

Gracias Jack! ¡La formación sabia hizo el truco! Sin embargo, el único problema que tengo es que no proporciona json válido (bueno, técnicamente lo hace). Hay una conversión de texto a json en curso como: {"3565": "[{\"type\":Tengo un apóstrofe antes de cada paréntesis y una barra inclinada antes de cada apóstrofe. Tenía esto antes y siempre es algo con el tipo de datos. Sin embargo, a decir verdad, no entiendo completamente cómo funciona la consulta que escribió y, por lo tanto, realmente no sé dónde y cómo solucionarlo.
ervazu

Probablemente esta no sea la mejor solución, pero acabo de usar la función de reemplazo para arreglar esto. Una vez más, gracias por tu tiempo!
ervazu

1
Esto funcionó para mi caso:json_agg(to_json(items.*)) as "items"
ricka
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.