2016-04-26 72 views
1

我有一個查詢,我在SELECT中使用CASE語句來分配'Team'列的值。然後我希望能夠在WHERE子句中使用我分配的值。有關示例,請參閱下面的示例查詢。在SELECT> CASE語句中分配數據,然後在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' 
+1

不能做到這一點。你需要一個子查詢或CTE。你不能在其對應的where子句中使用'select'中定義的別名。 –

+0

如果您真的想要 – TheGameiswar

回答

3

Yoiu不能引用別名,在WHERE子句becasue的WHERE calues通常被評估前列表達式來確定如何收集適當的行。

你可以重複上述CASEWHERE子句中或使用子查詢:

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' 

由於您的WHERE子句僅命中一個可能CASE你也可以做

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 
WHERE s.id = 200 /* equivalent to 'Team B' */ 
+0

,您也可以使用交叉申請不是「*通常*評估之前...」,但「***總是***之前評估... *」。 –

+0

@PieterGeerkens當涉及到特定於實現的SQL答案時,我試圖避免使用絕對數據,因爲有太多的變體,因此一些平臺平臺以不同的順序來完成查詢。但你是對的。在大多數(如果不是全部的話)平臺中,首先評估where子句。 –

+0

在SQL中,必須首先評估WHERE - 與Select()遵循LINQ中的Where()完全相同的原因:該語言的數學基礎需要它。然而,我確實要保持對絕對的謹慎態度。 –

0

任何操作完成它的前一階段對其下一個邏輯階段是可見的。因此,訂單從開始,其中,分組依據,具有,選擇,排序,頂部 ..您可以看到定義從伊茨克奔甘here

在你的情況teamA的分配列表,TeamB在where子句completion.So其中沒有關於他們的想法後做..

如果你想要做的,你需要參考他們在CTE或一些派生表中,否則你可以使用交叉應用。

只是爲了演示。在這種情況下,這是不需要的,即使執行計劃比較簡單,具有散列匹配功能(如果您有索引on 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