(我查了一下,无法找到答案,如果这是重复的,只需指出一个链接,我就会删除此问题)
我们说我有以下代码
select CASE WHEN lower(Http_User_Agent) like '%mobi%' then 'Mobile'
else 'Desktop' end as Device
from Http_User_Agent
where Device = 'Mobile'
返回
Msg 207, Level 16, State 1, Line 4
Invalid column name 'Device'.
我基本上尝试做的是按新创建的列Device
进行过滤。有一个简单的方法吗?
我在Windows 7上使用SQL Server 2008
答案 0 :(得分:3)
在执行查询时,Device
别名尚未分配给结果集。所以你需要这样做:
SELECT
CASE WHEN LOWER(Http_User_Agent) LIKE '%mobi%' THEN 'Mobile'
ELSE 'Desktop'
END AS Device
FROM Http_User_Agent
WHERE
CASE WHEN LOWER(Http_User_Agent) LIKE '%mobi%' THEN 'Mobile'
ELSE 'Desktop'
END = 'Mobile'
...即。根本不参考新的别名。或者这个
SELECT *
FROM
(SELECT
CASE WHEN LOWER(Http_User_Agent) LIKE '%mobi%' THEN 'Mobile'
ELSE 'Desktop'
END AS Device
FROM Http_User_Agent)
WHERE Device = 'Mobile'
...即从周围的选择中引用它
答案 1 :(得分:1)
不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值。
因此,您必须在case
子句中再次编写where
语句。
答案 2 :(得分:1)
您可以使用子查询执行此操作:
select ua.*
from (select ua.*,
(CASE WHEN lower(Http_User_Agent) like '%mobi%' then 'Mobile'
else 'Desktop'
end) as Device
from Http_User_Agent ua
) ua
where Device = 'Mobile';
或重复条件:
select ua.*,
(CASE WHEN lower(Http_User_Agent) like '%mobi%' then 'Mobile'
else 'Desktop'
end) as Device
from Http_User_Agent ua
where lower(Http_User_Agent) like '%mobi%';
但是,您不能在where
中使用与其定义的同一级别的列别名。这是ANSI标准的一部分,而不是"限制" SQL Server(或任何其他数据库)。