Você faz duas perguntas:
1.
Por que não posso fazer referência ao alias de custo SELECT na cláusula WHERE?
2.
Mas por que ordem por custo desc; é permitido?
O manual tem uma resposta para ambos aqui:
O nome de uma coluna de saída pode ser usado para se referir ao valor da coluna emORDER BY
eGROUP BY
cláusulas, mas não noWHERE
ouHAVING
cláusulas; lá você deve escrever a expressão em vez disso.
É definido pelo padrão SQL e o motivo é a sequência de eventos em um
SELECT
inquerir. No momento WHERE
cláusulas são aplicadas, colunas de saída no SELECT
lista ainda não foi computada. Mas quando se trata de ORDER BY
, as colunas de saída estão prontamente disponíveis. Então, embora isso seja inconveniente e confuso no começo, ainda faz sentido.
Relacionado:
- PostgreSQL Where count condition
- Melhor maneira de obter a contagem de resultados antes da aplicação de LIMIT