2011-04-18 80 views
2

我开始简单:幻影“名字”专栏?

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”列在第三个查询中来自何处?

回答

8

这是PostgreSQL的自动加密功能,允许拨打function(argument)作为argument.function

你真正调用是

SELECT NAME(core_school) 
FROM core_school 

比较这样的:

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

这是相当自我解释。

这个“特征”通常会导致混淆,并将在9.1中被删除(最终)。

0

也许你有和我一样不同的Postgres版本。 (我有8.3.7。)但是我没有任何这样的“幻影”名称列。

如果你只是说“从core_school中选择core_school”,那么表中的每一行都会得到一行输出,该行由该表中所有列的值组成。这就是你所看到的。

哦,我注意到你得到一个经销商的专栏名称。也许你真的没有在“core_school”和“name”之间加一个空格,而现在“name”是列名的别名。 (我的Postgres安装需要使用“as”来为列名创建别名,但有些数据库不需要这样做,所以也许在Postgres的某个地方有一个选项可以兼容。)