database postgresql – ¿Alias ​​de columna en la cláusula FROM de Postgres?

Pregunta:

Estoy leyendo la documentación de Postgres, la página sobre declaraciones SELECT, y encontré un aspecto de alias que nunca había encontrado.

En la sección de cláusulas FROM , alias de subtítulo, hay una oración que dice:

Si se escribe un alias, también se puede escribir una lista de alias de columna para proporcionar nombres sustitutos para una o más columnas de la tabla.

No hay ejemplos dados en la documentación que pude encontrar.

Sé cómo configurar nombres de salida como alias, pero eso no parece ser lo mismo.


La sinopsis de SELECT incluye las líneas:

... SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ [ AS ] output_name ] [, ...] [ FROM from_item [, ...] ] ...

Y define from_item

Respuesta:

Los alias de columna anulan los nombres / alias de columna de la subconsulta de selección interna (tabla derivada). De la misma manera, pueden anular los nombres de las columnas de la tabla (no importa en absoluto si es una tabla base, una vista, una tabla derivada o un cte).

Entonces, el ejemplo simple dará un error:

select 
    a, count_a              -- invalid here (have been overridden)
from 
    ( select t.a, count(*) as count_a
      from t
      group by t.a
      order by count_a desc           -- count_a is valid here
      limit 8
    ) 
      as d (b, count_b) ;

pero esto funcionará:

select 
    b, count_b              -- valid column aliases
from     
    -- identical as above 

los nombres a y count_a son válidas dentro de la subconsulta (tabla derivada) pero no fuera porque han sido anulado por b y count_b .

¿Tiene que conocer la secuencia exacta de columnas definidas en la tabla, o puede establecer un alias solo para una o dos de ellas en la cláusula FROM ?

Sí, debes conocer la secuencia de columnas.

Pero no es necesario cambiar todas las columnas. Digamos que la tabla tiene 5 columnas. Si utiliza:

select t.*
from table_name as t (a,b,c) ; 

solo las primeras 3 columnas aparecerán con los nuevos nombres (a, b, c). El 4 y el 5 se mostrarán con sus nombres reales. Obtendrá un error si proporciona más alias de los necesarios (por ejemplo, 6 alias para una tabla de 5 columnas).

¿Qué sucede si solo desea establecer un column_alias para una columna con un nombre muy largo (y dejar las otras columnas sin alias)? ¿es posible? (Si es así, ¿este Postgres es específico?)

Solo si es el primero. O proporcionando todos los nombres de columna anteriores hasta la columna a la que desea asignar un alias con un nombre diferente.

Supongo que no puede simplemente dar un alias solo para la tercera columna, o algo así.

No conozco ninguna sintaxis que le permita asignar un alias solo a la tercera columna, sin proporcionar los nombres de la primera y la segunda columna.


En general, la utilidad de la función es al menos discutible cuando se usa para tablas base. Y la consulta anterior que anula los nombres de solo 3 de las posiblemente muchas columnas apesta a ofuscación y podría considerarse una mala práctica.

Pero la función se proporciona porque es SQL estándar y para que esté completa. No tendría sentido tener esto solo para subconsultas y CTE y no para otros tipos de tablas.

Un caso en el que puede ser útil es (no con la tabla base sino con) la construcción VALUES , donde las columnas obtienen los nombres predeterminados de column1 , column2 , etc. y este alias puede usarse para seleccionar nombres más significativos:

select 
    a, b
from 
    ( values
         (1, 2),
         (2, 3), 
         (3, 5)
    ) 
      as d (a, b) ;

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım