Estou tentando converter uma subconsulta arbitrária em JSON no PostgreSQL.
json_agg()
parece ser a ferramenta óbvia para o trabalho. Por exemplo:
select json_agg(a) from (
select count(lead_source), lead_source from leads_table group by lead_source order by count desc
) as a;
No entanto, os dados são estruturados como arquivos the_data[row_number]["column_name"]
. Suponha que eu queira dados estruturados como the_data["column_name"][row_number]
. Ou seja, quero a estrutura de transposição de json_agg(). Como faço isso?
Meu melhor esforço é:
select row_to_json(row(array_to_json(array_agg(count)), array_to_json(array_agg(lead_source)))) from (
select count(lead_source), lead_source from leads_table group by lead_source order by count desc
) as a;
Mas isso tem (pelo menos) duas desvantagens:
- Não funciona para uma subconsulta arbitrária. Os nomes das colunas devem ser codificados sempre que
array_agg()
forem usados. - Os nomes das colunas se tornam
f1
,f2
, ...
Isso resolverá o problema do nome f1,f2,f3, mas infelizmente não consigo pensar em uma maneira fácil de fazer uma consulta arbitrária.
Este não é tão curto, mas permitirá que você coloque um arbitrário em sua subconsulta e gere as colunas. (resolvendo o problema 1 e o problema 2). Ele pega carona no hstore, portanto, se você não tiver o hstore instalado, precisará fazer um: CREATE EXTENSION hstore;