TSQL中有没有办法做这样的事情:
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”的技巧)。
答案 0 :(得分:20)
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
答案 1 :(得分:5)
这是一个使用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
答案 2 :(得分:3)
另一个选择是将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
答案 3 :(得分:2)
使您发布的查询成为子查询,并从中选择d = 6.据我所知,无法在同一查询中引用派生列。
答案 4 :(得分:2)
我将在这一点上同意AlexKuznetsov,但我还要补充一点,如果您的查询(无论多么复杂)限制WHERE
条款中存在的情况CASE
,那些CASE
将永远不会被退回,不应该首先被选中。
例如,您将d
设置为'6',其中a
为'2',然后限制为WHERE d = 6
,因此您可以改为:
SELECT a,b,c,
6 AS d
FROM some_table
WHERE a = 2
这将以更优化和干净的方式返回相同的结果。这就是为什么,恕我直言,能够引用派生列是没有意义的。
答案 5 :(得分: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