Postgresql: объединение объектов в массив (json) (проблемы подзапроса)


8

Извините за смутное название, но я просто не знаю подходящих слов, чтобы описать это.

У меня есть этот запрос, который превращает кучу столбцов в объект, который работает просто отлично:

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

Однако я хочу сгруппировать объекты, которые попадают в определенную категорию, в массив. Эта категория определяется четвертой колонкой внутри моей таблицы с именем «cargoProductId». Массив должен иметь значение «cargoProductId» в качестве ключа. Так:

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

Так что я боролся с этим последние полтора часа или около того. Я действительно понятия не имею, как это сделать. Это то, что я имею сейчас:

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

Ответы:


9

Если вы работаете на 9.4, вы можете получить что-то вроде этого:

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;

Спасибо, Джек! Мудрое образование сделал свое дело! Единственная проблема, которую я имею, состоит в том, что она не предоставляет действительный JSON (технически это делает). Там происходит преобразование текста в json, например: у {"3565": "[{\"type\":меня есть апостроф перед каждой скобкой и косая черта перед каждым апострофом. У меня было это раньше, и это всегда что-то с типом данных. Однако, по правде говоря, я не совсем понимаю, как работает написанный вами запрос, и поэтому я не знаю, где и как это исправить.
ervazu

Возможно, это не лучшее решение, но я просто использовал функцию замены, чтобы исправить это. Еще раз спасибо за ваше время!
ervazu

1
это сработало для моего случая:json_agg(to_json(items.*)) as "items"
Рикка
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.