sql if参数为true,添加where子句

时间:2017-03-03 00:09:33

标签: sql sql-server-2008 tsql

我有一个带有交叉连接和左连接的长存储过程。我在这个表中有几个参数。在最后两个左连接中,我想基于参数添加条件where子句。

我将调用此参数@NonCAT,它基本上是类别代码。我试图实现的where子句只是删除了非类别代码。非类别代码的代码如下:

CATCOD IN ('0', '114', '214', '314', '414', '614')

因此,CATCOD列中的任何数字都被视为非cat代码。 否则,如果它们被包括在内,就好像它们不在where子句中一样,它们被认为是猫代码。所以这是我最后两个左连接中的where子句:

AND CASE
       WHEN il.CATCOD IN ('0', '114', '214', '314', '414', '614') 
          THEN 'NonCAT'
          ELSE 'CAT'
    END = @NonCAT

如果我尝试提取类别代码@NonCAT变量只是varchar(20)并且为了测试而将其设置为'NonCAT'作为其值,则此工作正常。有了where子句,我将提取非cat代码。

我想要一个条件语句,比如变量@NonCAT = 'CAT',我想省略where子句。我该怎么做呢?我已经尝试了各种案例陈述,它比听起来更难。非常感谢帮忙。

编辑:我尝试在where子句中使用iff语句,例如

AND (IF @NonCAT = 'NonCAT'
     BEGIN
         CASE
            WHEN il.CATCOD IN ('0', '114', '214', '314', '414', '614') 
               THEN 'NonCAT'
               ELSE 'CAT'
         END = @NonCAT
     END)

似乎不起作用。我可以在代码的最前端使用IF语句作为标志,但这似乎不是非常有效,因为如果有意义的话,我必须在没有where子句的情况下重写整个事件。

1 个答案:

答案 0 :(得分:0)

你的意思是这样的吗?

WHERE   ( ( @nonCAT = 'nonCAT' AND il.CATCOD IN ('0', '114', '214', '314', '414', '614') )
      OR ( (ISNULL(@nonCAT,'') <> 'nonCAT' ))