在SELECT> CASE语句中分配数据,然后在WHERE子句中使用?

时间:2016-04-26 02:11:58

标签: sql sql-server

我有一个查询,我在SELECT中使用CASE语句来分配'Team'列的值。然后,我希望能够在WHERE子句中使用我赋值的值。请参阅下面的示例查询以获取示例。

在我的简化示例中,我知道我可以在WHERE子句中使用s.id值并获得所需的结果,但是我有一个更复杂的场景我正在使用它对实际使用字符串有帮助我在WHERE子句中赋值。

这可能吗?我正在使用MS SQL Server 2012。

在我做的搜索中,我没有找到任何确定的信息,无论如何。提前谢谢!

SELECT s.tickedNum, s.ticketSummary,'Team' =
      CASE
         WHEN s.id in (100) THEN 'Team A'
         WHEN s.id in (200) THEN 'Team B'
         WHEN s.id in (300) THEN 'Team C'
         ELSE 'Unknown'
      END,
FROM supportTable s
WHERE
'Team' = 'Team B'

2 个答案:

答案 0 :(得分:3)

Yoiu无法在WHERE子句中引用别名,因为{<1}}列表通常在之前计算,以确定如何收集正确的行。

您可以重复WHERE子句中的CASE或使用子查询:

WHERE

由于你的where子句只能点击一个SELECT * FROM ( SELECT s.tickedNum, s.ticketSummary, CASE WHEN s.id in (100) THEN 'Team A' WHEN s.id in (200) THEN 'Team B' WHEN s.id in (300) THEN 'Team C' ELSE 'Unknown' END AS Team, FROM supportTable s ) inner WHERE inner.Team = 'Team B' ,你也可以点击

CASE

答案 1 :(得分:0)

在上一阶段完成的任何操作都可以在下一个逻辑阶段看到。所以顺序就像 from,where,group by,having,select,order by,top ..你可以看到来自Itzik Ben Gan的明确名单here

在你的情况下,teamA的分配,TeamB是在where子句完成之后完成的。所以不知道它们..

如果你想这样做,你需要在CTE或某些派生表中引用它们,否则你可以使用交叉申请..

仅用于演示。在这种情况下不需要这个,即使执行计划更简单,具有散列匹配(如果你有ID上的索引,将用于合并连接)和计算标量

create table test
(
id int,
name varchar(3)
)


insert into test
select 1,'abc'
union all
select 2,'cde'

select id,case id when 1 then 'abc'
                   when 2 then 'cde'
                   else null end  'values'
from test t1
cross apply
(select case id when 1 then 'abc'
                   when 2 then 'cde'
                   else null end  'values_apply' from test t2 where t1.id=t2.id) a
where a.values_apply='abc'

<强>输出:

id value
1   abc