【问题标题】:T-SQL alias from CASE statement in SELECT clause not recognized in WHERE clauseSELECT 子句中 CASE 语句的 T-SQL 别名在 WHERE 子句中无法识别
【发布时间】:2014-06-12 14:19:07
【问题描述】:

为什么第一个查询有效,而第二个查询无效?为什么使用 CASE 语句时不能识别别名?如何修复第二个查询以使 WHERE 子句起作用?

SELECT
[a],
[b],
[c],
[d],
[e],
(CASE WHEN (SELECT COUNT(*) FROM Y WHERE Y.a = X.b AND Y.b IS NOT NULL) > 1 then 1 else 0 END) Q
FROM X
--WHERE Q = 1

SELECT
[a],
[b],
[c],
[d],
[e],
(CASE WHEN (SELECT COUNT(*) FROM Y WHERE Y.a = X.b AND Y.b IS NOT NULL) > 1 then 1 else 0 END) Q
FROM X
WHERE Q = 1

第二次查询出错:

Invalid column name 'Q'

【问题讨论】:

  • 请阅读here中的“Select语句的逻辑处理顺序”:“因为SELECT子句是第8步,所以该子句中定义的任何列别名或派生列都不能被前面的子句引用” WHERE 是第 4 步。
  • +1 .. 感谢您的参考

标签: sql sql-server case where


【解决方案1】:

这是正确的行为。如果要在 where 子句中使用别名,请使用子查询或 CTE:

SELECT X.*
FROM (SELECT [a], [b], [c], [d], [e],
             (CASE WHEN (SELECT COUNT(*) FROM Y WHERE Y.a = X.b AND Y.b IS NOT NULL) > 1 then 1 else 0
              END) Q
      FROM X
     ) X
WHERE Q = 1;

【讨论】:

  • 你也可以只考虑(SELECT COUNT(*) FROM Y WHERE Y.a = X.b AND Y.b IS NOT NULL)
【解决方案2】:

除非在FROM 子句中引入,否则不能在WHERE 子句中使用列别名。要么重复整个表达式,要么将 SELECT 放在 CTE 中,然后与 CTE 一起使用别名。

【讨论】:

  • 不正确,或至少不完整。在FROM 子句中引入的列别名可以在WHERE 子句中使用。
  • 感谢您指出这一点。我已经编辑了我的答案以包含您的观点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多