2015-06-01 17 views
0

爲什麼這樣:SELECT (users.email) AS renamed_column FROM users ORDER BY lower(renamed_column) DESC不起作用? (錯誤列renamed_column不存在)更低排序更名列

我不受SELECT lower(users.email) AS renamed_column FROM users ORDER BY renamed_column DESC影響,因爲我想原始值按降低值排序。

PS:這是一個例子,其實'users.email'被一個子請求所取代。但是問題存在於簡單的字段或者子請求中。我不明白爲什麼帶有重命名列的ORDER BY lower()失敗。

+1

無關,但:不加沒用括號。最好使用'users.email'而不是'(users.email)'。在圓括號之間插入列並不總是做你認爲它的做法(例如'(col1,col2)'是不同於Postgres中的'col1,col2'! –

回答

1

別名renamed_column你給只用於成果,可以在其他地方只能用於時裝有限。約ORDER BY子句PostgreSQL documentation狀態:

每個表達式可以是名稱或輸出列的序數(選擇列表項),或者它可以是從輸入列值構成的任意表達式。

所以,現在看來,這是確定以做ORDER BY renamed_column DESC因爲它是一個輸出列,但如果它是一個「任意表達式」,它必須使用輸入列的值

因此,要做到這一點的唯一方法是

SELECT (users.email) AS renamed_column FROM users ORDER BY lower(users.email) DESC 
+0

但這:' SELECT(users.email)AS renamed_column FROM users ORDER BY renamed_column DESC' works。可以在order子句中使用別名,但不能在其上執行函數? – barbacan

+0

@barbacan其實,你是對的。沒有足夠好的測試,它確實在訂購... –

+0

@barbacan找到了關於這個問題的文檔部分 –

0

試試這個:

SELECT (users.email) AS renamed_column FROM users ORDER BY lower((users.email)) DESC 
+0

完美地工作,但有子請求,例如: ' SELECT(SELECT('​​TEST'):: text)AS renamed_column FROM users ORDER BY lower((SELECT('​​TEST'):: text))DESC' 兩個相同的子請求被啓動... – barbacan