幻影“名字”专栏?

时间:2011-04-18 16:51:30

标签: postgresql

我开始很简单:

hoops=# select * from core_school limit 3;
 id |   school_name    | nickname 
----+------------------+----------
  1 | Marshall         | 
  2 | Ohio             | 
  3 | Houston          | 
(10 rows)

让我们介绍一个故意错误:

hoops=# select name from core_school;
ERROR:  column "name" does not exist
LINE 1: select name from core_school;

但为什么这样呢? (意外结果!):

hoops=# select core_school.name from core_school limit 3;
  name       
-----------------
(1,Marshall,"")
(2,Ohio,"")
(3,Houston,"")
(3 rows)

第三个查询中“name”列的来源是什么?

2 个答案:

答案 0 :(得分:8)

这是PostgreSQL的自动广播功能,允许将function(argument)称为argument.function

你真正打电话的是

SELECT  NAME(core_school)
FROM    core_school

与此相比:

SELECT  (1::int).exp
--
2.71828182845905

这是非常自我解释的。

此“功能”通常会导致混淆,并且(最终)会在9.1中删除。

答案 1 :(得分:0)

也许你有一个与我不同的Postgres版本。 (我有8.3.7。)但我没有任何这样的“幽灵”名称栏。

如果您只是说“从core_school选择core_school”,您将为表中的每一行获得一行输出,该行包含表中所有列的值数组。这就是你所看到的。

哦,我注意到你得到了经销商的专栏名称。也许你并没有在“core_school”和“name”之间设置一个句点,而是一个空格,现在“name”是列名的别名。 (我的Postgres安装需要单词“as”来为列名创建一个别名,但是有些数据库不需要这个,所以也许Postgres中有一个选项可以兼容。)