2016-11-18 71 views
0

我有一份声明 - 简化WHERE从CASE结果

SELECT UserID, 
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 AS Deleted 
FROM User 
WHERE Deleted = 0; 

但这不起作用,因为Deleted不能使用。

是否有解决方法?我无法以这种方式解决这个问题,因为在我的真实声明中这是一个巨大的子选择。

+0

使用WHERE和子查询的问题是什么? –

+1

如果您想知道为什么无法在where子句中引用列别名,这是所谓[逻辑处理顺序](https://destinationdata.wordpress.com/2016/01/10/the-logical-processing-order-3/)的结果。 TL/DR:查询中的每个子句都按设定的顺序执行。每个子句的输出成为下一个的输入。 select子句在where子句之后处理。 –

+0

@ destination-data,这在许多方面都是错误的。整个语句在执行前处理,因此在执行时间内所有内容都是已知的。某些数据库,例如Teradata支持SQL语句每个部分的别名。 –

回答

4

将原始查询包装在派生表中。 (因为列别名在同一查询的where子句中不可用)。

select * 
from 
(
    SELECT UserID, 
      CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END AS Deleted 
    FROM User 
) dt 
WHERE dt.Deleted = 0; 
+0

@Andrew L是SQL Server所需的dt表别名吗?根据ANSI SQL它是可选的,但我知道一些产品需要它 - 但我永远不会记得哪些产品。 – jarlh

+0

我想有一个'END'丢失...... – Shnugo

+0

它已经解决了,@jarlh,太急于回答:D ..而且之后没有编辑!但是+1很酷的快速回复。 – Vikrant

0

我们可以像下面那样使用没有子查询。

SELECT * 
FROM [User] 
WHERE (CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END)=0 
+0

现在“已删除”字段丢失 – Toshi

+0

删除字段不是必需的。我们可以直接使用。为什么我们需要'删除'字段? –