2013-01-07 73 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中工作,但只是因爲它不符合標準。我敢肯定,標準是以這種方式寫的,但我個人同意你的觀點 - 這是一個可怕的可用性疣。 –