是否有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」)。
是否有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」)。
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
讓您發佈查詢子查詢,其中d = 6,據我所知是沒有辦法在同一個查詢引用派生列從中選擇。
這是使用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
願望這是upvoted更因爲它比接受的答案嘈雜少得多(spasibo!)。 – MushinNoShin 2015-07-23 17:42:51
我打算在這一個與AlexKuznetsov同意,但我也想補充一點,如果您的查詢是(不管多少複雜)限制在CASE
中存在的WHERE
子句的情況下,那麼這些CASE
將永遠不會被返回,因此不應該首先被選中。
例如,你設置d
到「6」,其中a
是「2」,然後限制WHERE d = 6
,所以你可以改爲做:
SELECT a,b,c,
6 AS d
FROM some_table
WHERE a = 2
這將返回更相同的結果優化和乾淨的時尚。這就是爲什麼恕我直言,能夠引用派生列沒有意義。
另一種選擇是實現您的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
的另一種方法,這是用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
謝謝,亞歷克斯 – 2010-10-14 01:56:32