Sql 基于新创建的列进行筛选

Sql 基于新创建的列进行筛选,sql,tsql,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 co

我查过了,找不到答案,如果这是重复的,只要指出一个链接,我就删除这个问题

假设我有以下代码

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'.
我基本上是想通过新创建的列设备进行过滤。有没有简单的方法

我正在windows 7上使用SQL server 2008

不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值


因此,您必须在where子句中再次编写case语句。

您可以使用子查询来完成此操作:

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%';

但是,不能在定义列别名的同一级别的位置中使用列别名。这是ANSI标准的一部分,不是SQL Server或任何其他数据库的限制。

执行查询时,设备别名尚未分配给结果集。因此,您需要这样做:

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'

…即从周围的select引用它

Http\U User\U代理是Http\U User\U代理表中的一列吗?@Deepshikha它们都是表和列看起来像是一个有效的问题。您的第一个选项非常有效,您需要从中删除一个额外的括号,而您的第二个代码在关键字“WHERE”附近给我一个错误语法。。我更喜欢您的第二个选项,您能修复它吗?我相信您需要命名新表,即当LOWERHttp_用户_代理(如“%mobi%”)较低时,从SELECT CASE中选择*,然后选择“Mobile”或“Desktop”作为Http_用户_代理的设备结束,其中设备=“Mobile”