Postgresql

在 WHERE 子句中使用列別名不起作用

  • December 11, 2019

給定一個users包含兩個欄位的表:idemail

select id, email as electronic_mail 
from (  
       select id, email 
       from users
) t 
where electronic_mail = ''

Postgres 抱怨說:

ERROR:  column "electronic_mail" does not exist

該範例只是為了展示出現的問題。我的實際情況更複雜,我遍歷 json 列中的元素數組,從每個元素中獲取一個標量值。(如果有幫助,我可以分享一些程式碼。)

我真的不明白會有什麼並發症,可能我不知道什麼。我的印像是可以在WHERE子句中使用別名列而沒有問題?

手冊在這裡澄清:

輸出列的名稱可用於在 ORDER BYandGROUP BY子句中引用列的值,但不能在WHEREorHAVING子句中;在那裡你必須寫出表達式。

這是根據 SQL 標準,可能不是很直覺。這背後的(歷史)原因是SELECT查詢中的事件順序。WHERE並在考慮列別名之前HAVING解決,而在應用列別名之後發生。 另請注意,輸入和輸出名稱之間的衝突以不同的方式解決-另一個歷史上的怪事(背後有原因,但仍然可能令人困惑)。看:GROUP BY``ORDER BY
ORDER BY``GROUP BY

最好先避免與輸入列名衝突的列別名。

另外:您範例中的子查詢只是噪音,因為該WHERE子句是外部查詢的一部分,因此該範例可以簡化為:

select id, email as electronic_mail 
from users t 
where electronic_mail = '';  -- doesn't work

引用自:https://dba.stackexchange.com/questions/225874