我现在必须遍历我的查询,并将它们转移到使用Oracle而不是SQLSERVER,而且我有点卡在这个查询上,我正在使用here
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
我完全不知道在这里该做什么。
我能做些什么来让它工作吗?
提前感谢
发布于 2011-09-15 00:23:43
我建议您采取一种稍微不同的方法。
查看此站点:http://psoug.org/reference/functions.html
查找引用"calc distance“的部分
发布于 2011-09-15 00:18:49
我知道如何在SQL Server中做到这一点,这应该很容易移植到Oracle:
下面是我创建的一个UDF,它使用Haversine公式获得两个邮政编码之间的乌鸦飞行距离:
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
ENDhttps://stackoverflow.com/questions/7418979
复制相似问题