请帮助语法,我需要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
答案 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'))