我可以使用标志来选择不同的WHERE子句吗?这样的事情。
SELECT fields
from T3 t3
left outer join T1 t1 on T1.Id=t2.Id
WHERE
CASE
WHEN @Status <> 1
THEN (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
ELSE t2.Id = @SID AND t2.StatusID = 12
GROUP BY whatever
答案 0 :(得分:2)
为什么你需要CASE WHEN?你能做什么WHERE状态&lt;&gt; 1 AND ......或......?
答案 1 :(得分:1)
您可以 - 只需向END
添加CASE
。
SELECT fields
FROM T3 t3
LEFT OUTER JOIN T1 t1 on T1.Id=t2.Id
WHERE
CASE
WHEN @Status <> 1 THEN
(t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
ELSE
t2.Id = @SID AND t2.StatusID = 12
END
GROUP BY whatever
答案 2 :(得分:1)
不确定。 CASE
返回一个值,因此用法如下:
where case
when @Mode = 1 and A.Foo = B.Foo then 1
when @Mode = 2 and A.Foo > B.Foo + 5 then 1
when A.Bar < @Mode then 1
else 0
end = 1
答案 3 :(得分:1)
首选方式:
WHERE
(@Status <> 1 AND t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
OR (t2.Id = @SID AND t2.StatusID = 12)
或者这是一个更容易阅读的案例陈述:
WHERE
CASE WHEN @Status <> 1
AND t3.Id = @SId
AND sh.StatusId = 3
AND k.StatusId = 1 THEN 1
WHEN t2.Id = @SID
AND t2.StatusID = 12 THEN 1
ELSE 0 END = 1
答案 4 :(得分:1)
我认为@JBrooks没有正确翻译您的案例陈述(令人担忧的是,可能会导致误报)。
我认为CASE
等价物如下:
WHERE 1 = CASE
WHEN @Status <> 1
THEN CASE
WHEN (t3.Id = @SID AND sh.StatusId = 3 AND k.StatusId = 1)
THEN 1
END
ELSE CASE
WHEN t2.Id = @SID AND t2.StatusID = 12
THEN 1
END
END
但是,我确实认为这样的结构很难阅读和调试,并且同意它可以被转换。然而,虽然@ JBrooks的“首选方式”是析取正常形式(即需要parens的(predicate_1 OR predicate_2)
),但我更喜欢联合正规形式(即preidcate_1 AND preidcate_2
),例如
WHERE
( p.Status = 1 OR ( t3.Id = p.SID AND sh.StatusId = 3 AND k.StatusId = 1 ) )
AND
( p.Status <> 1 OR ( t2.Id = p.SID AND t2.StatusID = 12 ) )