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
動作する可能性があります (ただし、group by 句がなければ動作しないと思います)。
where
問題は、句内で選択したテーブルのスコープ内でしか名前を使用できないことです。Where
は、行が選択される前に行を除外する事前フィルターであるため、フィールド定義のこのような式はまだ実行されておらず、そのためエイリアスは使用できません。
このHaving
句は、グループ化後にポスト フィルターとして機能し、クエリのエイリアスを使用できますが、実際のgroup by
句が必要になると思いますが (わかりません)。
別の方法として、最初に各行の距離を選択し、次にそれらの結果から関連する距離のみを選択するサブ選択 (派生テーブルまたは選択で選択) を使用することもできます。これはうまくいきます:
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
または、式を繰り返すことができます。これにより、クエリの保守が難しくなりますが、場合によってはこれでうまくいく可能性があります。たとえば、実際の距離を返したくない場合、たとえば、その距離にある関心のあるポイントの名前のみを返します。その場合、句にのみ式を含める必要があります。そのwhere
場合、保守性の議論はなくなり、このソリューションは完全な代替手段です。
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