基于新创建的列进行过滤

时间:2014-06-25 12:04:46

标签: sql tsql

(我查了一下,无法找到答案,如果这是重复的,只需指出一个链接,我就会删除此问题)

我们说我有以下代码

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

3 个答案:

答案 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(或任何其他数据库)。