json_build_object()
no Postgres 9.4 ou mais recente
Ou
jsonb_build_object()
para retornar jsonb
. SELECT value_two, json_agg(json_build_object('value_three', value_three
, 'value_four' , value_four)) AS value_four
FROM mytable
GROUP BY value_two;
O manual:
Cria um objeto JSON a partir de uma lista de argumentos variádicos. Por convenção, a lista de argumentos consiste em chaves e valores alternados.
Para qualquer versão (incluindo Postgres 9.3)
row_to_json()
com uma ROW
expressão faria o truque:SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Mas você perde os nomes das colunas originais. Uma conversão para um tipo de linha registrado evita isso. (O tipo de linha de uma tabela temporária também serve para consultas ad hoc.)
CREATE TYPE foo AS (value_three text, value_four text); -- once in the same session
SELECT value_two
, json_agg(row_to_json((value_three, value_four)::foo)) AS value_four
FROM mytable
GROUP BY value_two;
Ou use uma subseleção em vez de
ROW
expressão. Mais detalhado, mas sem conversão de tipo:SELECT value_two
, json_agg(row_to_json((SELECT t FROM (SELECT value_three, value_four) t))) AS value_four
FROM mytable
GROUP BY value_two;
Mais explicações na resposta relacionada de Craig:
- PostgreSQL 9.2 row_to_json() com junções aninhadas
db<>mexa aqui
antigo sqlfiddle