2013-01-07 77 views
1

我想通过一些奇特的排名函数对我的postgres结果进行排序,但为了简单起见,假设我想添加两个自定义行并按它们排序。通过自定义命名行排序

SELECT my_table.*, 
    extract(epoch from (age(current_date, '2012-09-12 10:43:40'::date)))/3600 AS age_in_hours 
    Fancy_function_counting_distance() AS distance 
FROM my_table 
ORDER BY distance + age_in_hours; 

但是,这是行不通的,因为我得到的错误:ERROR: column "distance" does not exist。 是否可以通过该自定义命名行来排序我的结果?

我运行的Postgres 9.1.x

+0

你的arent从调用完告诉它什么选择过吗? –

+0

你是对的,抱歉,修正了示例查询。 – user1105595

回答

3

按照SQL标准,在SELECT列表别名不是在ORDER BY可见。

您可以使用列位置指定(例如ORDER BY 1,2),但不接受表达式;例如,您不能ORDER BY 1+2。所以,你需要使用子查询生成的结果集,然后它在外部查询排序:

SELECT * 
FROM (
    SELECT my_table.*, 
    extract(epoch from (age(current_date, '2012-09-12 10:43:40'::date)))/3600 AS age_in_hours 
    Fancy_function_counting_distance() AS distance 
    FROM my_table 
) x 
ORDER BY distance + age_in_hours; 
+0

嗯...有点吸(关于别名的可见性) - 我不知道我是否可以做这样的子查询(我通过ORM(ActiveRecord)运行这个查询),我不知道它是否会正常工作,谢谢你的回答,这真的很有帮助! – user1105595

+0

@ user1105595很高兴提供帮助。顺便说一句,这将在MySQL中工作,但只是因为它不符合标准。我敢肯定,标准是以这种方式写的,但我个人同意你的观点 - 这是一个可怕的可用性疣。 –