将STDistance应用于表的所有行?

时间:2019-04-25 16:57:29

标签: sql-server tsql sql-server-2012 geolocation

我正在尝试返回[store]中距离小于10英里的所有行。表[Store]的列类型为Geography

我了解如何找到两个特定点之间的距离,如下所示:

declare @origin geography
select @origin = geography::STPointFromText('POINT(' + CAST(-73.935242 AS 
VARCHAR(20)) + ' ' + CAST(40.730610 AS VARCHAR(20)) + ')', 4326)

declare @destination geography
select @destination = geography::STPointFromText('POINT(' + CAST(-93.732666 AS VARCHAR(20)) + ' ' + CAST(30.274096 AS VARCHAR(20)) + ')', 4326)

select @origin.STDistance(@destination)/ 1609.344 as 'distance in miles'

我无法将此逻辑应用于SELECT语句。我想获取所有行中@origin@destination之间的距离,而不是@originstore.Geolocation之间的距离。

1 个答案:

答案 0 :(得分:0)

Geography的一个实例使用并应用于另一个实例的STDistance方法返回两点之间的距离。它可以与变量一起使用,例如@Origin.STDistance( @Destination ),列或它们的组合,例如在特定@Origin的10英里范围内查找所有商店:

select *
  from Store
  where @Origin.STDistance( Store.Geolocation ) < 1609.344 * 10.0;

注意:正如BenThul指出的那样,空间索引处理有些变幻无常。与常量比较的STDistance是SARGable:@Origin.STDistance( Store.Geolocation ) < 1609.344 * 10.0,但此数学上等效的表达式不是:@Origin.STDistance( Store.Geolocation ) / 1609.344 < 10.0here中记录了此“功能”。