Ответ 1
Попробуйте этот запрос:
SELECT array_to_json(array_agg(t)) FROM t
В результате получается следующий JSON:
[{"a":1,"b":"value1"},{"a":2,"b":"value2"},{"a":3,"b":"value3"}]
Здесь SQLFiddle: http://sqlfiddle.com/#!15/5860d/11/0. Результаты SQLFiddle имеют некоторую странную вещь "Value"
/"Type"
, которая происходит в объекте JSON, и она ускользает от строки результата (которая отображается на "Value"
), но, похоже, это не происходит при запуске на простой PostgreSQL, Похоже, это какая-то причуда SQLFiddle.
Что касается хорошего дизайна или не зависит от вашего конкретного приложения. В целом, бенчмаркинг был бы лучшим способом сказать, работает ли это для вас с точки зрения производительности. Что касается ремонтопригодности, я не вижу особых проблем. Наоборот. Это упрощает ваш код приложения и означает, что он меньше, по крайней мере, на мой взгляд. Если PG может дать вам именно тот результат, который вам нужен из коробки, единственная причина, по которой я могу думать, что не использовать его, - это соображения производительности. Не изобретайте велосипед и все.
Изменить:
Я не понимал, что вы ищете запросы для обоих результатов.
Во-первых, для вашего второго результата вы можете использовать:
SELECT row_to_json(r)
FROM (SELECT array_agg(t.a) AS a
, array_agg(t.b) AS b
FROM t
) r
Подзапрос позволяет вам управлять именами ключей в результирующем объекте JSON. Это дает
{"a":[1,2,3],"b":["value1","value2","value3"]}
SQLFiddle: http://sqlfiddle.com/#!15/5860d/42/0
Во-вторых, в моем копании я обнаружил пару других функций, введенных в 9.3, которые вы должны рассмотреть:
1) json_agg
: это делает то, что вы хотите для своего первого результата из коробки.
SELECT json_agg(t) FROM t
SQLFiddle: http://sqlfiddle.com/#!15/5860d/38/0
2) to_json
: Это можно использовать вместо array_to_json
или row_to_json
и дает те же результаты.
SELECT to_json(array_agg(t)) FROM t
SQLFiddle: http://sqlfiddle.com/#!15/5860d/10/0