2011-04-18 79 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的某個地方有一個選項可以兼容。)