SELECT子句中CASE语句的T-SQL别名在WHERE子句中无法识别

时间:2014-06-12 14:19:07

标签: sql sql-server case where

为什么第一个查询有效,但不是第二个?使用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'

2 个答案:

答案 0 :(得分:3)

这是正确的行为。如果要在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;

答案 1 :(得分:0)

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