我有一份声明 - 简化WHERE从CASE结果
SELECT UserID,
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 AS Deleted
FROM User
WHERE Deleted = 0;
但这不起作用,因为Deleted
不能使用。
是否有解决方法?我无法以这种方式解决这个问题,因为在我的真实声明中这是一个巨大的子选择。
我有一份声明 - 简化WHERE从CASE结果
SELECT UserID,
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 AS Deleted
FROM User
WHERE Deleted = 0;
但这不起作用,因为Deleted
不能使用。
是否有解决方法?我无法以这种方式解决这个问题,因为在我的真实声明中这是一个巨大的子选择。
将原始查询包装在派生表中。 (因为列别名在同一查询的where子句中不可用)。
select *
from
(
SELECT UserID,
CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END AS Deleted
FROM User
) dt
WHERE dt.Deleted = 0;
我们可以像下面那样使用没有子查询。
SELECT *
FROM [User]
WHERE (CASE WHEN UserName = 'xxx' THEN 1 ELSE 0 END)=0
现在“已删除”字段丢失 – Toshi
删除字段不是必需的。我们可以直接使用。为什么我们需要'删除'字段? –
使用WHERE和子查询的问题是什么? –
如果您想知道为什么无法在where子句中引用列别名,这是所谓[逻辑处理顺序](https://destinationdata.wordpress.com/2016/01/10/the-logical-processing-order-3/)的结果。 TL/DR:查询中的每个子句都按设定的顺序执行。每个子句的输出成为下一个的输入。 select子句在where子句之后处理。 –
@ destination-data,这在许多方面都是错误的。整个语句在执行前处理,因此在执行时间内所有内容都是已知的。某些数据库,例如Teradata支持SQL语句每个部分的别名。 –