我正在阅读 Postgres 文档、关于 SELECT 语句的页面,并且遇到了我从未遇到过的别名方面的问题。
在FROM 子句的部分,副标题alias,有一句话说明:
如果编写了别名,则还可以编写列别名列表来为表的一个或多个列提供替代名称。
文档中没有我能找到的示例。
我知道如何将输出名称设置为别名,但这似乎不是一回事。
SELECT 的概要包括以下几行:
... SELECT [ ALL | DISTINCT [ ON (
expression
[, ...] ) ] ] * |
expression
[ [ AS ]
output_name
] [, ...] [ FROM
from_item
[, ...] ] ...
并定义from_item
为:
其中 from_item 可以是以下之一:
[ ONLY ]
table_name
[ * ] [ [ AS ]
alias
[ (
column_alias
[, ...] ) ] ] (
select
) [ AS ]
alias
[ (
column_alias
[, ...] ) ] ...(other forms omitted)...
请注意,from_item
实际上包括 column_alias
.
对我来说,( select )
可以在 FROM 子句(而不仅仅是 output_names,在 SELECT 语句的“表达式”中)为表单赋予列别名是有意义的,因为在大多数情况下,子查询的“列”将被显式选择因此序列将是已知的。所以我想在这种情况下 column_alias 值可能只是一个名称列表,并且它们将按顺序与子查询返回的列匹配。(虽然一个例子会很好。)
但是,如何将列别名用于 table_name? 您是否必须知道表中定义的列的确切顺序,或者您可以在 FROM 子句中为其中的一两个设置别名?
如果您只想column_alias
为一个名称很长的列设置 a(并且不为其他列设置别名)怎么办?这可能吗?(如果是这样,这个 Postgres 是特定的吗?)
那里的列别名会覆盖内部选择子查询(派生表)的列名/别名。同样,它们可以覆盖表的列名(无论是基表、视图、派生表还是 cte 都无关紧要)。
所以,这个简单的例子会报错:
但这会起作用:
名称
a
和count_a
在子查询(派生表)内部有效,但在外部无效,因为它们已被b
and覆盖count_b
。是的,您必须知道列的顺序。
但是您不必更改所有列。假设该表有 5 列。如果您使用:
只有前 3 列会出现新名称 (a,b,c)。第4和第5将显示他们的真实姓名。如果您提供的别名多于所需的别名(例如,5 列表的 6 个别名),则会出现错误。
只有当它是第一个。或者通过提供所有以前的列名称,直到您想要使用不同名称别名的列。
我不知道有任何语法允许您只为第 3 列起别名,而不提供第 1 列和第 2 列的名称。
总的来说,当用于基表时,该功能的有用性至少是值得商榷的。上面的查询只覆盖了可能很多列中的 3 个的名称,这会产生混淆,并且可以很好地被认为是不好的做法。
但是提供该功能是因为它是标准 SQL 并且是为了完整性。仅将其用于子查询和 CTE 而不适用于其他类型的表是没有意义的。
它可能有用的一种情况是(不是使用基表而是使用)
VALUES
构造,其中列的默认名称为column1
,column2
等,并且此别名可用于选择更有意义的名称: