Luego de consultar con expertos en este tema, programadores de deferentes ramas y profesores hemos dado con la respuesta al dilema y la plasmamos en esta publicación.
Solución:
No puede usar columnas con alias en un WHERE
cláusula. Puede intentar usar una tabla derivada. Tal vez algo como esto (lo siento, no probado):
SELECT * FROM
(SELECT SQRT(POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)) * 62.1371192
AS DistanceFromAddress from tblProgram) mytable
WHERE DistanceFromAddress < 2
Él WHERE
se procesa la cláusula antes de la SELECT
cláusula
; with Distances as (
select SQRT(POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)) * 62.1371192
AS DistanceFromAddress
from tblProgram
)
select * from Distances where DistanceFromAddress < 2
, por lo que los alias no están disponibles. Pase a usar una subconsulta o CTE: aquí hay un CTE: SELECT
WHERE
- bueno, los sistemas son libres de reordenar las operaciones como mejor les parezca, siempre que el resultado sea "como si" la declaración SQL se procesara en un cierto orden lógico. Por supuesto, donde todo esto sale mal con SQL Server es donde produce errores debido a problemas de conversión en el
select
SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 AS DistanceFromAddress
from tblProgram
having DistanceFromAddress < 2
cláusula para filas/valores que deben ser eliminados por el
cláusula. where
podría funcionar (aunque creo que no, sin tener una cláusula group by también). Where
El problema es que solo puede usar nombres en el ámbito de la(s) tabla(s) que seleccione dentro del
cláusula. Having
es un filtro previo que filtra las filas antes de que se seleccionen, por lo que expresiones como esta en la definición de campo aún no se ejecutan y, por lo tanto, los alias no están disponibles. group by
Él
funciona como un filtro de publicación después de la agrupación y puede usar alias de la consulta, aunque me temo que necesitará tener un
select d.DistanceFromAddress
from
(select
SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 AS DistanceFromAddress
from tblProgram) d
where d.DistanceFromAddress < 2
cláusula (no estoy seguro). La alternativa es tener una subselección (tabla derivada o selección en selección), donde primero selecciona las distancias para cada fila y luego selecciona solo las distancias relevantes de esos resultados. Esto funcionará: O puedes repetir la expresión. Esto hace que su consulta sea más difícil de mantener, pero en algunos casos esto podría funcionar para usted. Por ejemplo, si no desea devolver la distancia real, sino solo, digamos, el nombre del punto de interés a esa distancia. En ese caso, necesitas tener la expresión where
solamente
select
tblProgram.POIname
/* Only if you need to return the actual value
, SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 AS DistanceFromAddress */
from tblProgram
where
-- Use this if you only want to filter by the value.
SQRT(
POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
) * 62.1371192 < 2
en elcláusula, en cuyo caso el argumento de mantenibilidad se ha ido, y esta solución es una alternativa perfecta.
Eres capaz de confirmar nuestra ocupación poniendo un comentario y dejando una valoración te damos las gracias.