首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle中的Haversine查询

Oracle中的Haversine查询
EN

Stack Overflow用户
提问于 2011-09-14 23:29:57
回答 2查看 4.2K关注 0票数 2

我现在必须遍历我的查询,并将它们转移到使用Oracle而不是SQLSERVER,而且我有点卡在这个查询上,我正在使用here

代码语言:javascript
复制
SELECT TOP 1 * FROM ( SELECT o.outcode AS lead_postcode, v.location, 
v.location_name, v.outcode AS venue_postcode, 6371.0E * 
( 2.0E *asin(case when 1.0E < (sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-
(RADIANS(CAST(v.lat AS FLOAT))))/2.0E)) + (cos(RADIANS(CAST(v.lat AS FLOAT))) 
* cos(RADIANS(CAST(o.lat AS FLOAT))) * square(sin(((RADIANS(CAST(o.lng AS FLOAT)))-
(RADIANS(CAST(v.lng AS FLOAT))))/2.0E))))) then 1.0E else 
(sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-(RADIANS(CAST(v.lat AS FLOAT))))
/2.0E)) + (cos(RADIANS(CAST(v.lat AS FLOAT))) * cos(RADIANS(CAST(o.lat AS FLOAT)))
* square(sin(((RADIANS(CAST(o.lng AS FLOAT)))-(RADIANS(CAST(v.lng AS FLOAT))))
/2.0E))))) end )) AS distance FROM venue_postcodes v, uk_postcodes o 
WHERE o.outcode = @nrpostcode ) i WHERE distance<100 ORDER BY distance

现在我知道这是一个可怕的查询,但Oracle似乎在它方面有很多问题。

首先,它不喜欢6371E中的E和所有后续的E

其次,它不喜欢square函数,所以我决定使用power函数,但这仍然给了我错误。

第三,它不喜欢radians函数

第四,它不喜欢TOP 1部分,所以我将其更改为在WHERE子句中使用ROWNUM

我完全不知道在这里该做什么。

我能做些什么来让它工作吗?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-15 00:23:43

我建议您采取一种稍微不同的方法。

查看此站点:http://psoug.org/reference/functions.html

查找引用"calc distance“的部分

票数 5
EN

Stack Overflow用户

发布于 2011-09-15 00:18:49

我知道如何在SQL Server中做到这一点,这应该很容易移植到Oracle:

下面是我创建的一个UDF,它使用Haversine公式获得两个邮政编码之间的乌鸦飞行距离:

代码语言:javascript
复制
ALTER FUNCTION [dbo].[fn_GetZipDistanceMiles](
    @ZipFrom VARCHAR(20),
    @ZipTo VARCHAR(20)
)
RETURNS FLOAT 
AS  
BEGIN 

    DECLARE @Latitude1 FLOAT
    DECLARE @Longitude1 FLOAT
    DECLARE @Latitude2 FLOAT
    DECLARE @Longitude2 FLOAT

    SELECT  @Latitude1 = Latitude,
            @Longitude1 = Longitude
    FROM    ZipCode
    WHERE   ZipCode = @ZipFrom


    SELECT  @Latitude2 = Latitude,
            @Longitude2 = Longitude
    FROM    ZipCode
    WHERE   ZipCode = @ZipTo

    -- CONSTANTS
    DECLARE @EarthRadiusInMiles FLOAT
    SET @EarthRadiusInMiles = 3963.1

    -- RADIANS conversion
    DECLARE @Lat1Radians FLOAT
    DECLARE @Long1Radians FLOAT
    DECLARE @Lat2Radians FLOAT
    DECLARE @Long2Radians FLOAT

    SET @Lat1Radians = @Latitude1 * PI() / 180
    SET @Long1Radians = @Longitude1 * PI() / 180
    SET @Lat2Radians = @Latitude2 * PI() / 180
    SET @Long2Radians = @Longitude2 * PI() / 180

    RETURN ACOS(COS(@Lat1Radians) * COS(@Long1Radians) * COS(@Lat2Radians) * COS(@Long2Radians) + COS(@Lat1Radians) * SIN(@Long1Radians) * COS(@Lat2Radians) * SIN(@Long2Radians) + SIN(@Lat1Radians) * SIN(@Lat2Radians)) * @EarthRadiusInMiles

END
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7418979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档