SQL Server AS 语句 WHERE 语句中的别名列

标签 sql sql-server tsql

我想要执行一个查询,其中使用“AS”语句重命名其中一列,并在“WHERE”语句中重用该别名列名。下面是一个例子:

SELECT lat AS latitude 
FROM poi_table 
WHERE latitude < 500

这里的问题是 SQL Server 不喜欢这个查询,因为 WHERE 子句和 WHERE 子句中引用了 AS 语句名称。谁能解释为什么会发生这种情况以及我可以采取什么措施来纠正我的情况?

假设我有一个在查询的 SELECT 部分中使用别名的公式,我该如何解决这个问题?

SELECT *, 
( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) 
AS distance
FROM poi_table 
WHERE distance < 500;

最佳答案

SQL 通常不允许您在 WHERE、GROUP BY 或 HAVING 子句中引用列别名。 MySQL确实支持在GROUP BY和HAVING中引用列别名,但我强调,将此类查询移植到其他数据库时会出现问题。

如有疑问,请使用实际的列名称:

SELECT t.lat AS latitude 
  FROM poi_table t
 WHERE t.lat < 500

我添加了一个表别名,以便更轻松地查看什么是实际列与别名。

更新

<小时/>

计算列,就像您在此处看到的那样:

SELECT *, 
       ( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) AS distance
  FROM poi_table 
 WHERE distance < 500;

...不会改变您不能在 WHERE 子句中引用列别名。为了使该查询正常工作,您必须使用:

SELECT *, 
       ( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) AS distance
  FROM poi_table
 WHERE ( 6371*1000 * acos( cos( radians(42.3936868308) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-72.5277256966) ) + sin( radians(42.3936868308) ) * sin( radians( lat ) ) ) ) < 500;

请注意,如果列上存在索引,则在列上使用函数(即:RADIANS(lat))将使索引变得无用。

关于SQL Server AS 语句 WHERE 语句中的别名列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3096301/

相关文章:

c# - SQL Server 参数化 SQL 查询 - 我还需要转义引号吗?

javascript - 在 Azure 移动服务 JavaScript 客户端中使用 Like 子句

c# - LINQ to Entities 等效于 sql "TOP(n) WITH TIES"

sql - 在 SQL Server 2008 中跨列返回最大值

java - 如何将 SQL(嵌套子查询)转换为 QueryBuilder 创建的查询

SQL Server : removing duplicate column while joining tables

sql - 让 AVG() 忽略 0?

SQL:基于 case 条件的 where 子句大于或等于?

sql - where 子句中的字符串连接

c# - 如何识别查询语句中有子查询?