PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Retornar como array de objetos JSON no SQL (Postgres)

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