2014-08-27 41 views
0

有鑑於此:鑄造列別名BY子句

CREATE TABLE test (
    a int, 
    b varchar(255) 
); 

INSERT INTO test VALUES(1, '100'); 
INSERT INTO test VALUES(1, '50'); 
INSERT INTO test VALUES(1, '075'); 
INSERT INTO test VALUES(1, '+50'); 
INSERT INTO test VALUES(1, '-50'); 

SELECT a, b AS c 
FROM test AS t 
ORDER BY t.a, c; 

SELECT a, b AS c 
FROM test AS t 
ORDER BY t.a, t.b::int; 

SELECT a, b AS c 
FROM test AS t 
ORDER BY t.a, c::int; 

最後的查詢返回的錯誤:
ERROR: column "c" does not exist: SELECT a, b AS c FROM test AS t ORDER BY t.a, c::int

我要訂購一個列別名給定的結果。
如果我另外想要施放由別名給出的特定列,則不起作用。

ORDER BY alias正在工作而ORDER BY alias::int不是什麼原因?
是否有另一種方法在轉換中使用列別名?

+0

您的[SQL小提琴](http://sqlfiddle.com/#!15/fbc54/1)爲空! – 2014-08-27 13:44:26

+0

我已經把SQL放入問題中了...... – m13r 2014-08-27 19:23:32

回答

1

這是一個很長的評論。

Here是一個早期的參考這個問題,從我引述:

ORDER BY (and also GROUP BY) permit references to output column names only when they are unadorned. You cannot use them in expressions.

如果讓我猜測這種情況的原因,它會與表達式求值做。我覺得Postgres的發動機邏輯重寫你的查詢是這樣的:

SELECT a, b AS c, c::int as INVISIBLEUNSEENCOLUMN 
FROM test AS t 
ORDER BY t.a, INVISIBLEUNSEENCOLUMN; 

也就是說,它移動的表達,其中表達通常評估(到我稱之爲在編着的「選擇」節點碼)。那麼,這會產生已知的列錯誤,因爲該代碼不能理解在同一級別定義的別名。當我想在查詢中使用列別名時,我經常使用子查詢來避免任何混淆。

解決該問題很容易:使用子查詢,使用order by中的原始列名稱,或在select中包含轉換值。

0

這是由於SQL和Select子句中的事件序列造成的;在設置列別名,是第二最後

1: FROM 
2: the JOINS 
3: WHERE clause 
4: GROUP BY clause 
5: HAVING clause 
6: SELECT clause 
7: ORDER BY clause 

ORDER BY是最後所以由那個級SELECT子句已經被執行和列別名然後可以借命令。

但是,在執行select子句之前的所有子句都不理解列別名。


大部分解決方法解決方法是「嵌套」查詢,例如,

select col_alias from (select x as col_alias from y) 

編輯:唯一例外的,我知道的是在產品的Teradata (有可能是別人,但我已經使用了許多)