我正在尝试返回[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
之间的距离,而不是@origin
和store.Geolocation
之间的距离。
答案 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.0
。 here中记录了此“功能”。