在SQL Server中具有无效的列名称

时间:2016-05-13 11:44:51

标签: sql .net sql-server

我很快就会问为什么我不能在距离上使用关键字?我需要以某种方式检查距离<例如20

SELECT 
    Id, Lat, Lng,
    (6367 * acos( cos( radians(45.444) )
      * cos( radians( Lat ) ) * cos( radians( Lng ) - radians(158.554) )
      + sin( radians(4545) ) * sin( radians( Lat ) ) ) ) AS distance 
FROM 
    Posts
HAVING 
    distance < 15  // Invalid column Name 
ORDER BY 
    distance

3 个答案:

答案 0 :(得分:2)

试试这个

SELECT * 
FROM
    (SELECT 
         Id, Lat, Lng,
         (6367 * acos(cos(radians(45.444)) * cos(radians(Lat)) * 
          cos(radians(Lng) - radians(158.554)) + sin(radians(4545)) * 
          sin(radians(Lat)))) AS distance 
     FROM Posts) p
WHERE 
    p.distance < 15  
ORDER BY 
    p.distance

答案 1 :(得分:2)

我可能会为此目的建议http://localhost/myStream.isml/manifest

outer apply

使用SELECT p.Id, p.Lat, p.Lng, d.distance FROM Posts p OUTER APPLY (SELECT (6367 * acos( cos( radians(45.444) ) * cos( radians( p.Lat ) ) * cos( radians( p.Lng ) - radians(158.554) ) + sin( radians(4545) ) * sin( radians( p.Lat ) ) ) ) AS distance ) d FROM Posts p WHERE d.distance < 15 ORDER BY distance; 代替HAVING是MySQL的扩展。在其他数据库中,您可以使用子查询,CTE或横向连接(这是WHERE所做的技术名称)。在这种情况下,我认为横向连接很方便,因为它将这个相当复杂的公式的逻辑分开。

答案 2 :(得分:-2)

你可以使用括号来表示你的意思是字段名称而不是一个pereserved关键字:

SELECT Id,Lat,Lng,(6367 * acos( cos( radians(45.444) )
      * cos( radians( Lat ) ) * cos( radians( Lng ) - radians(158.554) )
      + sin( radians(4545) ) * sin( radians( Lat ) ) ) ) AS distance FROM Posts
       HAVING [distance] < 15  // Invalid column Name 
       ORDER BY distance