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 BYeGROUP BYcláusulas, mas não noWHEREouHAVINGclá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