在SQL server中查询哈弗辛公式



我试图从SQL server 2014数据库访问某些区域的驾驶员。表名为DriverLocationHistory

下面是我使用的sql查询:
SELECT id, ( 6371 * acos( cos( radians(37) ) * cos( radians( latitude ) ) 
* cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(latitude)) ) ) AS distance 
FROM DriverLocationHistory 
HAVING distance < 5 
ORDER BY distance 

当我执行查询时,我得到这个错误:

Msg 207, Level 16, State 1, Line 7
Invalid column name 'distance'.

我被要求提供一种使用内置地理数据类型完成此操作的方法。这对于注释来说有点长,所以下面是:

ALTER TABLE [DriverLocationHistory] ADD geoLocation 
   AS geography::Point([Latitude], [Longitude], 4236);
declare @p geography = geography::Point(37, -122, 4236);
select * from [DriverLocationHistory]
where geoLocation.STDistance(@p) < 5000;

空间索引应该有助于where子句在select语句中的可搜索性。

Where子句中不能使用别名。这是因为where子句是在生成结果集之前处理的,或者在生成结果集时处理的,并且在生成结果集之前不分配别名。只有在聚合查询(其中有一个By组)中才能这样做,因为在处理聚合之前,别名被分配给某个表达式的值。您的查询必须在where子句(不需要是Having子句)和按以下顺序使用完整表达式:

SELECT id, 
  ( 6371 * acos( cos( radians(37) )  
      * cos( radians( latitude ) ) 
      * cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) 
      * sin(radians(latitude)) ) ) AS distance 
FROM DriverLocationHistory 
Where 6371 * acos( cos( radians(37) )  
      * cos( radians( latitude ) ) 
      * cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) 
      * sin(radians(latitude)) ) < 5 
ORDER BY 6371 * acos( cos( radians(37) )  
      * cos( radians( latitude ) ) 
      * cos( radians( Longitude ) - radians(-122) ) + sin( radians(37) ) 
      * sin(radians(latitude)) )
如注释中提到的,您可以按顺序使用别名,

或者,您也可以在子查询中执行计算和别名赋值:

SELECT id, distance
From (Select ( 6371 * acos( cos( radians(37) )  
          * cos( radians( latitude ) ) 
          * cos( radians( Longitude ) - radians(-122) ) + 
             sin( radians(37) ) 
          * sin(radians(latitude)) ) ) distance 
      From DriverLocationHistory)z
Where distance < 5 
ORDER BY distance

最新更新