Postgresql
在 WHERE 子句中使用列別名不起作用
給定一個
users
包含兩個欄位的表:id
和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 BY
andGROUP BY
子句中引用列的值,但不能在WHERE
orHAVING
子句中;在那裡你必須寫出表達式。這是根據 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