sql - Oracle 半正矢查询

标签 sql sql-server oracle haversine

我目前必须检查我的查询并将它们转移到使用 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

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

关于我能做些什么来让它发挥作用,有什么想法吗?

提前致谢

最佳答案

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

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

查找涉及“计算距离”的部分

关于sql - Oracle 半正矢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7418979/

相关文章:

sql - 如何在存储过程中调用C#函数

c# - 我该如何处理这个错误?

oracle - 如何在oracle中获取用户定义的OPERATOR

database - Oracle用rownum查看性能

java - 使用 JDBC 从 dbms_output.get_lines 获取输出

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql-server - SQL Server 数据库的排序规则与服务器默认排序规则不同是否会带来麻烦?

oracle - 关于频繁项集的 PL/SQL 问题

sql - 将数据帧添加到 Spark 中的列表

php - 将 SQL 转换为 JSON 并保留空值?