2010-01-19 107 views
9

是否有TSQL辦法做到像這樣使用的一個派生選擇列:TSQL Where子句

select a,b,c, 
case 
    when a=1 then 5 
    when a=2 then 6 
end as d 
from some_table 
where d=6 

實際case語句是非常複雜的,所以我試圖避免重蹈覆轍在where子句中?有沒有什麼技巧可以做到這一點?

(我認爲MySQL中有一個技巧使用「擁有d = 6」)。

回答

18
select a,b,c FROM(
select a,b,c, 
case 
    when a=1 then 5 
    when a=2 then 6 
end as d 
from some_table 
) AS t 
where d=6 
+0

謝謝,亞歷克斯 – 2010-10-14 01:56:32

2

讓您發佈查詢子查詢,其中d = 6,據我所知是沒有辦法在同一個查詢引用派生列從中選擇。

4

這是使用CTEs的好地方,例如:

WITH MassagedData (a, b, c, d) AS 
(
    select a, b, c, 
     case 
      when a=1 then 5 
      when a=2 then 6 
     end as d 
    from some_table 
) 

SELECT a,b,c 
FROM MassagedData 
where d=6 
+0

願望這是upvoted更因爲它比接受的答案嘈雜少得多(spasibo!)。 – MushinNoShin 2015-07-23 17:42:51

2

我打算在這一個與AlexKuznetsov同意,但我也想補充一點,如果您的查詢是(不管多少複雜)限制在CASE中存在的WHERE子句的情況下,那麼這些CASE將永遠不會被返回,因此不應該首先被選中。

例如,你設置d到「6」,其中a是「2」,然後限制WHERE d = 6,所以你可以改爲做:

SELECT a,b,c, 
    6 AS d 
FROM some_table 
WHERE a = 2 

這將返回更相同的結果優化和乾淨的時尚。這就是爲什麼恕我直言,能夠引用派生列沒有意義。

1

另一種選擇是實現您的case語句作爲函數。特別適合轉換或計算問題。功能的好處在於「業務」邏輯集中在一個地方,並且可以輕鬆地在其他查詢中重複使用。

-- sample code not tested 

CREATE FUNCTION dbo.fn_MyConvertA(
    -- Add the parameters for the function here 
    @a int 
) 
RETURNS int -- for example 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @ResultVar as int 

-- Add the T-SQL statements to compute the return value here 
set @ResultVar = case when @a = 1 then 5 when @a = 2 then 6 else 10 end 

-- Return the result of the function 
RETURN @ResultVar 

END 
GO 

-- now you case write your query 
select a,b,c, dbo.fn_MyConvertA(a) as d 
from some_table   
where dbo.fn_MyConvertA(a)=6 
0

的另一種方法,這是用CROSS APPLY

select a,b,c, 
from some_table 
CROSS APPLY (SELECT case 
        when a=1 then 5 
        when a=2 then 6 
        end) CxA(d) 
where d=6