Postgres 中具有相同别名的两列
Two columns with the same alias in Postgres
为什么允许查询
SELECT
'foo' "baz",
'bar' "baz"
在 Postgres 中(在 9.6 上测试)?这在哪些情况下有意义?乍一看,这似乎是一个很大的错误来源。
这是用户对数据呈现方式的责任。有两种典型情况是新手应该注意的。第一个涉及 anonymous 列,例如:
select 'alfa', 'beta'
?column? | ?column?
----------+----------
alfa | beta
第二个涉及连接具有相同列名的表,例如
select *
from company c
join employee e on company_id = c.id
id | name | id | name | company_id
----+---------+----+-------+------------
1 | Company | 1 | Smith | 1
在这两种情况下,都应该使用别名来使列名明确且提供更多信息。我总是在其他人可以阅读的查询中这样做。但是,当我临时查询数据库时,我有时会庆幸 Postgres 没有太多限制,我不必写下几个列名而不是星号。
最重要的是,Postgres 会检查列名是否在真正相关的情况下是唯一的,并且绝不允许违反数据完整性,例如:
create view my_view as
select 'foo' as "baz", 'bar' as "baz"
ERROR: column "baz" specified more than once
为什么允许查询
SELECT
'foo' "baz",
'bar' "baz"
在 Postgres 中(在 9.6 上测试)?这在哪些情况下有意义?乍一看,这似乎是一个很大的错误来源。
这是用户对数据呈现方式的责任。有两种典型情况是新手应该注意的。第一个涉及 anonymous 列,例如:
select 'alfa', 'beta'
?column? | ?column?
----------+----------
alfa | beta
第二个涉及连接具有相同列名的表,例如
select *
from company c
join employee e on company_id = c.id
id | name | id | name | company_id
----+---------+----+-------+------------
1 | Company | 1 | Smith | 1
在这两种情况下,都应该使用别名来使列名明确且提供更多信息。我总是在其他人可以阅读的查询中这样做。但是,当我临时查询数据库时,我有时会庆幸 Postgres 没有太多限制,我不必写下几个列名而不是星号。
最重要的是,Postgres 会检查列名是否在真正相关的情况下是唯一的,并且绝不允许违反数据完整性,例如:
create view my_view as
select 'foo' as "baz", 'bar' as "baz"
ERROR: column "baz" specified more than once