56

SQL Server 2005 で以下のコードを実行しようとすると、エラーが発生します

無効な列名 DistanceFromAddress

コード:

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 
where 
    DistanceFromAddress < 2

selectステートメントを使用して値を正しく取得していますが、状態where DistanceFromAddress < 2を確認しようとするとエラーが発生します。

この問題を解決するにはどうすればよいですか?

4

5 に答える 5

56

WHERE句でエイリアス列を使用することはできません。派生テーブルを使用してみることができます。おそらく次のようなものです(申し訳ありませんが、テストされていません):

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
于 2013-04-23T06:07:56.930 に答える
38

句は句 (*)のWHERE処理されるため、エイリアスは使用できません。サブクエリまたはCTEの使用に移行します。CTE は次のとおりです。SELECT

; 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

(*) - まあ、システムは、SQL ステートメントが特定の論理順序で処理されたかのように結果が「あたかも」である限り、操作を自由に並べ替えることができます。もちろん、SQL Server でこれがすべてうまくいかないのは、句で削除する必要がある行/値の句での変換の問題が原因で、エラーが発生する場所です。SELECTWHERE

于 2013-04-23T06:07:10.417 に答える
3
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
于 2013-04-23T06:07:37.130 に答える
0

最終的な値を表示するには AS しか使用できないと思います。比較を行うには、select をその中の別の select ステートメントから返す必要があります。

お気に入り:

SELECT a.disfromaddr 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) 
a WHERE a.disfromaddr < 2

これを試すことができます。

于 2013-04-23T06:15:44.467 に答える