Dada uma tabela users
com dois campos: id
e email
.
select id, email as electronic_mail
from (
select id, email
from users
) t
where electronic_mail = ''
O Postgres reclama que:
ERROR: column "electronic_mail" does not exist
O exemplo é apenas para demonstrar o problema que surge. Meu caso real é mais complexo, eu itero através de uma matriz de elementos em uma coluna json, pegando um único valor escalar de cada um. (Posso compartilhar algum código se isso ajudar.)
Eu realmente não entendo qual seria a complicação, provavelmente eu desconheço alguma coisa. Fiquei com a impressão de que colunas com alias podem ser empregadas em uma WHERE
cláusula sem problemas?
O manual esclarece aqui:
Isso está de acordo com o padrão SQL e pode não ser muito intuitivo. A razão (histórica) por trás disso é a sequência de eventos em uma
SELECT
consulta.WHERE
eHAVING
são resolvidos antes que os aliases de coluna sejam considerados, enquantoGROUP BY
eORDER BY
acontecem posteriormente, após a aplicação dos aliases de coluna.Observe também que os conflitos entre os nomes de entrada e saída são resolvidos de maneira diferente em
ORDER BY
eGROUP BY
- outra estranheza histórica (com uma razão por trás disso, mas potencialmente confusa). Ver:É melhor evitar aliases de coluna que entrem em conflito com nomes de coluna de entrada a priori.
A parte: a subconsulta em seu exemplo é apenas ruído, pois a
WHERE
cláusula faz parte da consulta externa, portanto, o exemplo pode ser simplificado para:A resposta foi meio que postada em um comentário, mas eu tive um problema semelhante e fui direcionado aqui, imaginei que compartilharia como resposta. Seu alias deve aparecer na seleção interna, não na externa.
Para um exemplo do mundo real (ou seja, este exemplo pode ser simplificado simplesmente não incluindo um alias):
Eu sei que este é um post muito antigo - mas acabei de encontrá-lo - o que eu fiz no passado foi "transformar" o campo - digamos usando trim(ab) como C,
isso parece forçar o alias a aceitar.