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
potrebbe funzionare (anche se non sembra, senza avere un gruppo dalla clausola pure).
Il problema è che è possibile utilizzare solo nomi nell'ambito della tabella o delle tabelle selezionate all'interno della clausola where
. Where
è un pre filtro che filtra le righe prima che siano selezionate, quindi espressioni come questa nella definizione del campo non sono ancora state eseguite e gli alias non sono disponibili.
La clausola Having
funziona come post filtro dopo il raggruppamento e può utilizzare alias dalla query, anche se temo che sia necessario avere una clausola effettiva (non sicura).
L'alternativa è avere una sottoselezione (tabella derivata o selezionare in selezione), dove si selezionano prima le distanze per ciascuna riga, quindi selezionare solo le distanze rilevanti da tali risultati. Funzionerà:
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
Oppure è possibile ripetere l'espressione. Ciò rende la tua query più difficile da mantenere, ma in alcuni casi potrebbe funzionare per te. Ad esempio se non vuoi restituire la distanza effettiva, ma solo, ad esempio, il nome del punto di interesse a quella distanza. In tal caso, è necessario avere l'espressione solo nella clausola where
, nel qual caso l'argomento manutenibilità è scomparso e questa soluzione è un'alternativa perfetta.
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
Possibile duplicato di [riferimento a un alias di colonna in una clausola WHERE] (https://stackoverflow.com/questions/8370114/referring-to-a-column-alias-in-a-where-clause) – Vadzim
I quess, basta duplicare l'espressione che la clausola 'WHERE' darebbe un piano migliore delle sottomissioni che sono proposte nelle risposte qui. – Vadzim