¿Es posible cambiar el nombre de los f1, f2, f3...nombres predeterminados cuando se usa la row_to_jsonfunción solo para algunas columnas?
puedo hacer
row_to_json(customers)
volviendo
{"id_customer":2,"first_name":"bla","last_name":"second_bla"}
Pero si solo quiero nombres sin id_customer, tengo que usar
row_to_json(row(first_name, last_name))
y luego me sale
{"f1":"bla","f2":"second_bla"}
Y me gustaría obtener este resultado con los nombres de columna predeterminados o con el mío. Sé que puedo crear mi propio tipo compuesto y usar
row_to_json(row(first_name, last_name))::my_custom_type
pero, ¿no es posible hacerlo bien en la consulta sin crear ese tipo?
postgresql
boobiq
fuente
fuente

Respuestas:
Una expresión de tabla común le permite especificar alias explícitamente, no solo para el CTE sino también para sus columnas.
Esto es diferente al ejemplo de @ dezso en que no usa
col AS aliaspara cada columna de unaSELECTlista; alias los nombres de columna en el alias de la tabla CTE.He usado un
VALUESexpresión como subconsulta, pero puedes usarSELECTlo que quieras; el punto es que cualquier alias de columna que se proporcione o se asuma en la subconsulta puede anularse en la definición de CTE especificando una lista de nombres de columna.Puede hacer lo mismo en una subconsulta, de nuevo en lugar de usar
AS alias:Esto no funciona con una
ROWexpresión directamente; solo puedes lanzar unROWtipo concreto, no puedes usar alias.fuente
hará lo que quiera sin ningún impacto en el rendimiento (y no es demasiado detallado):
fuente
Puedes hacer algo como esto:
(Por supuesto, lo mismo se puede lograr con
pero encontré el primero más legible).
En la
WITHparte puedes construir filas de cualquier estructura sobre la marcha.fuente
Puedes usar
json_build_object.fuente