sql >> Base de Datos >  >> RDS >> PostgreSQL

Devolver como matriz de objetos JSON en SQL (Postgres)

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