sql server选择IN的情况

时间:2014-11-05 13:28:45

标签: sql case where

请帮助语法,我需要IN子句只在参数= 1时否则所有记录

不工作

SELECT * FROM T 
    WHERE T.C = 'AAA' 
    AND CASE WHEN @Param = 1 THEN T.ID IN ('1','2','3') END - this condition only needed when @param = 1

我试试下面,但是如何得到所有记录?

   AND T.ID IN CASE WHEN @Param = 1 THEN ('1','2','3') ELSE -all rows- END

1 个答案:

答案 0 :(得分:4)

请勿使用CASE

像这样重写你的SQL:

WHERE
    T.C = 'AAA'
AND (
    (@Param = 1 AND T.ID IN ('1', '2', '3'))
    OR
    (@Param <> 1)
    )

当您了解其工作原理/原因时,根据需要删除空白。

如果我们改变OR部分的顺序,那么它甚至可以缩短(对于我们这些人来说,不是真的必须更容易理解):

WHERE
    T.C = 'AAA'
AND (
    @Param <> 1
    OR
    T.ID IN ('1', '2', '3')
    )

如果@Param 与1不同,则它必须为1,因此您不需要在另一个分支中明确检查它。

因此,最好的方法是:

WHERE
    T.C = 'AAA'
AND (@Param <> 1 OR T.ID IN ('1', '2', '3'))