我想要执行一个查询,其中使用“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/