Como regla general, hay una de dos cosas que hay que saber sobre el SELECT
cláusula:
- Aunque está escrito primera, se evalúa última, con a excepción de la cláusula
ORDER BY
. Esta es la razón por la cual no puede usar ningún campo calculado o alias en ninguna otra cláusula (particularmente la WHERE
) excepto en la cláusula ORDER BY
.
- Los cálculos en la cláusula
SELECT
se realizan en paralelo, o al menos se manejan como si fueran. Es por eso que no puede usar un cálculo como parte de otro.
Por lo tanto, la respuesta corta es que no se puede, y eso es por diseño.
La notable excepción a esto es Microsoft Access, donde puede utilizar cálculos en columnas posteriores y WHERE
cláusulas. Sin embargo, aunque es conveniente, en realidad no es una ventaja: no seguir los principios anteriores es menos eficiente. Pero está bien para bases de datos livianas, que es para lo que se supone que se debe usar Access.
Si realmente desea volver a utilizar los resultados calculados, necesitará una consulta por separado, ya sea en forma de una sub consulta o como una Expresión de tabla común. Los CTE son mucho más fáciles de trabajar, ya que son más claros de leer.
Editar
Sin cambiar el punto de la respuesta original, pensé que podría añadir que creo que esta explicación es posiblemente un poco mal intencionada.
Los DBMS modernos hacen un gran esfuerzo en la planificación y optimización de consultas, por lo que ya no es correcto, si es que alguna vez, que la consulta se ejecuta realmente en un orden particular. Por lo que puedo ver, no hay técnico por lo que el optimizador no pudo mirar hacia el futuro e incorporar resultados calculados en el análisis de la consulta, incluso si solo es para sustituir expresiones.
Oh, bueno ...
posible duplicado de [PostgreSQL Vistas: Hacer referencia a un campo calculado en otro campo calculado] (http://stackoverflow.com/questions/2385791/postgresql-views-referencing-one-calculated-field -in-another-calculate-field) –
'funciona en SQL'? Nos ha mostrado SQL y luego ha declarado que no funciona. Entonces, ¿qué quieres decir con "* en SQL *"? –