2014-08-27 71 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 (有可能是别人,但我已经使用了许多)