É possível renomear f1, f2, f3...
nomes padrão ao usar row_to_json
a função apenas para algumas colunas?
eu posso fazer
row_to_json(customers)
retornando
{"id_customer":2,"first_name":"bla","last_name":"second_bla"}
Mas se eu quiser apenas nomes sem id_customer
, tenho que usar
row_to_json(row(first_name, last_name))
e então eu recebo
{"f1":"bla","f2":"second_bla"}
E eu gostaria de obter esse resultado com nomes de coluna padrão ou com meus próprios. Eu sei que posso criar meu próprio tipo composto e usar
row_to_json(row(first_name, last_name))::my_custom_type
mas não é possível fazer isso direito na consulta sem criar esse tipo?
A pergunta
fará o que você deseja sem nenhum impacto no desempenho (e não é muito detalhado):
Uma expressão de tabela comum permite especificar aliases explicitamente, não apenas para o CTE, mas também para suas colunas.
Isso é diferente do exemplo do @dezso, pois não usa
col AS alias
para cada coluna em umaSELECT
lista; ele alia os nomes das colunas no alias da tabela CTE.Eu usei uma
VALUES
expressão como uma subconsulta, mas você pode usarSELECT
o que quiser; o ponto é que quaisquer aliases de coluna fornecidos ou assumidos na subconsulta podem ser substituídos na definição de CTE especificando uma lista de nomes de colunas.Você pode fazer a mesma coisa em uma subconsulta, novamente em vez de usar
AS alias
:Isso não funciona com uma
ROW
expressão diretamente; você só pode converter umROW
para um tipo concreto, você não pode apelidá-lo.Você pode usar
json_build_object
.Você pode fazer algo assim:
(Claro, o mesmo pode ser alcançado com
mas achei o primeiro mais legível.)
Na
WITH
peça você pode construir linhas de qualquer estrutura em tempo real.Tão simples como abaixo: