我正在尝试从 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
Run Code Online (Sandbox Code Playgroud)
当我执行查询时,我收到此错误:
Msg 207, Level 16, State 1, Line 7
Invalid column name 'distance'.
Run Code Online (Sandbox Code Playgroud)
我被要求提供一种使用内置地理数据类型来执行此操作的方法。对于评论来说有点太长了,所以这里是:
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;
Run Code Online (Sandbox Code Playgroud)
空间索引应该有助于 select 中 where 子句的 SARGability。