Have/Where 子句不适用于使用 Microsoft SQL 的 Haversine 公式

Posted

技术标签:

【中文标题】Have/Where 子句不适用于使用 Microsoft SQL 的 Haversine 公式【英文标题】:Having/Where clause not working for Haversine Formula using Microsoft SQL 【发布时间】:2015-07-03 16:37:49 【问题描述】:

这是我的名为“test”的表 - 在此处查看快照test

然后是我的行项目:这里 - rowitems

我使用的是半正弦公式,他是我的查询

  SELECT *, ( 3960 * acos( cos( radians( 33.650800 ) ) *
  cos( radians( Latitude ) ) * cos( radians(  Longitude  ) - radians( -117.891729 ) ) +
  sin( radians( 33.650800 ) ) * sin( radians(  Latitude  ) ) ) ) AS Distance 
  FROM test

由于某种原因,HAVINGWHERE 子句不适用于 Distance

它适用于LatitudeLongitude

但是当我尝试做WHERE Distance < 10 or HAVING Distance < 10。上面写着Distance is an invalid column name

我需要能够做到这一点,并使用Distance 进行查询。任何帮助将不胜感激。

【问题讨论】:

我鼓励您阅读此内容:blogs.lessthandot.com/index.php/datamgmt/datadesign/… 在此博客中,我展示了一些加快邻近搜索执行速度的巧妙方法。如果您的表有很多行,则尤其如此。 点赞!好问题! 【参考方案1】:

您不能在 where 或 having 子句中使用计算字段。创建视图或使用子查询

试试这个:

select * FROM (SELECT *, ( 3960 * acos( cos( radians( 33.650800 ) ) *
cos( radians( Latitude ) ) * cos( radians(  Longitude  ) - radians( -117.891729 ) ) +
sin( radians( 33.650800 ) ) * sin( radians(  Latitude  ) ) ) ) AS Distance 
FROM test) as T WHERE T.Distance < 10

【讨论】:

【参考方案2】:

您需要将查询放入子查询、视图或 CTE(公用表表达式)中。

以下是您的 CTE 任务示例:

WITH cte_test (Name, Latitude, Longitude, Distance)
AS 
(
    SELECT Name, Latitude, Longitude, 
         3960 * acos(cos(radians(33.650800)) 
         * cos(radians( Latitude ) )  
         * cos( radians(  Longitude  ) - radians( -117.891729 ) ) 
         + sin( radians( 33.650800 ) ) * sin( radians(  Latitude  ) ) ) ) 
         AS Distance 
    FROM test
)
SELECT * from cte_test where Distance < 10 ;

CTE 是一种“临时视图”。它也是一种强大的工具,也可用于创建递归查询。

【讨论】:

以上是关于Have/Where 子句不适用于使用 Microsoft SQL 的 Haversine 公式的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 函数不适用于 WHERE 子句

二级缓存 EF codeFirst 和 Predicate 不适用于 where 子句

ADD_DATE() 不适用于 mysql 中的 where 子句

Laravel 分页不适用于 group by 子句

Where 子句不适用于 ClickHouse 视图

“if”子句不适用于 clickhouse 中的插入查询