Saltar al contenido

Cómo usar el nombre de la columna de alias en la cláusula where en SQL Server

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *