如何在SQL Server的where子句中使用别名列名

Kan*_*nan 43 sql-server-2005

当我尝试在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
Run Code Online (Sandbox Code Playgroud)

我正在使用select语句正确获取值,但是当我尝试检查条件时,where DistanceFromAddress < 2我收到错误.

我该如何解决这个问题?

Ste*_*lfe 41

您不能在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
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 30

WHERE子句在子句(*)之前处理SELECT,因此别名不可用.转到使用子查询或CTE - 这是一个CTE:

; 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
Run Code Online (Sandbox Code Playgroud)

(*) - 好吧,只要结果"好像"SQL语句按某个逻辑顺序处理,系统就可以自由地重新排序操作.当然,在SQL Server 出现问题的地方,由于SELECT条款应该消除的行/值的子句中的转换问题,它会产生错误WHERE.