json_build_object()
en Postgres 9.4 o posterior
O jsonb_build_object()
para devolver 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;
El manual:
Crea un objeto JSON a partir de una lista de argumentos variados. Por convención, la lista de argumentos consta de claves y valores alternos.
Para cualquier versión (incluido Postgres 9.3)
row_to_json()
con una ROW
la expresión haría el truco:
SELECT value_two
, json_agg(row_to_json((value_three, value_four))) AS value_four
FROM mytable
GROUP BY value_two;
Pero pierde los nombres de las columnas originales. Una conversión a un tipo de fila registrado evita eso. (El tipo de fila de una tabla temporal también sirve 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;
O use una subselección en lugar de ROW
expresión. Más detallado, pero sin tipo de letra:
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;
Más explicación en la respuesta relacionada de Craig:
- PostgreSQL 9.2 row_to_json() con uniones anidadas
db<>violín aquí
Sqlfiddle antiguo