Gob*_*ffi 21 sql t-sql sql-server
我想执行一个查询,在该查询中,我使用'AS'语句重命名其中一个列,并在'WHERE'语句中重用该别名列名.以下是一个例子:
SELECT lat AS latitude
FROM poi_table
WHERE latitude < 500
Run Code Online (Sandbox Code Playgroud)
这里的问题是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;
Run Code Online (Sandbox Code Playgroud)
OMG*_*ies 31
SQL通常不允许您在WHERE,GROUP BY或HAVING子句中引用列别名.MySQL确实支持在GROUP BY和HAVING中引用列别名,但我强调在将此类查询移植到其他数据库时会导致问题.
如有疑问,请使用实际的列名:
SELECT t.lat AS latitude
FROM poi_table t
WHERE t.lat < 500
Run Code Online (Sandbox Code Playgroud)
我添加了一个表别名,以便更容易查看实际的列与别名是什么.
一个计算列,就像你在这里看到的那样:
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;
Run Code Online (Sandbox Code Playgroud)
...不会更改您无法在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;
Run Code Online (Sandbox Code Playgroud)
请注意RADIANS(lat),如果列上存在索引,则使用列上的函数(IE :) 将使索引无效.
tgo*_*sch 12
SQL Server被调整为在应用别名之前应用过滤器(因为这通常会产生更快的结果).你可以做一个嵌套的select语句.例:
SELECT Latitude FROM
(
SELECT Lat AS Latitude FROM poi_table
) A
WHERE Latitude < 500
Run Code Online (Sandbox Code Playgroud)
我意识到这可能不是你想要的,因为它使你的查询更加冗长.更简洁的方法是创建一个包装基础表的视图:
CREATE VIEW vPoi_Table AS
SELECT Lat AS Latitude FROM poi_table
Run Code Online (Sandbox Code Playgroud)
然后你可以说:
SELECT Latitude FROM vPoi_Table WHERE Latitude < 500
Run Code Online (Sandbox Code Playgroud)
我不确定为什么你不能使用"lat"但是,如果必须的话,你可以重命名派生表中的列.
select latitude from (SELECT lat AS latitude FROM poi_table) p where latitude < 500
Run Code Online (Sandbox Code Playgroud)