Where子句中的条件基于标志

时间:2012-03-27 21:42:27

标签: sql tsql

我可以使用标志来选择不同的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

5 个答案:

答案 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 ) )