SQL SP-Where子句中的Case语句

时间:2018-11-15 16:48:47

标签: sql sql-server stored-procedures case where-clause

在下表中

 ID     AMT
 -------------
 347    0.00
 575    725.00
 362    125.00
 540    80.00

我想在where子句中使用case语句,以基于存储过程的两个输入参数过滤结果。这是我的SP的样子

 CREATE PROC SS(@AMT_GREATER_THAN INT, @AMT_LESS_THAN INT)
 AS
 BEGIN
     SELECT ID, AMT FROM TABLE
     WHERE 
     1 = CASE WHEN @AMT_GREATER_THAN IS NOT NULL AND @AMT_LESS_THAN IS NOT 
                   NULL AND AMT BETWEEN @AMT_LESS_THAN AND @AMT_GREATER_THAN 
                   THEN 1
              WHEN @AMT_GREATER_THAN IS NOT NULL AND AMT > @AMT_GREATER_THAN 
                   THEN 1
              WHEN @AMT_LESS_THAN IS NOT NULL AND AMT < @AMT_LESS_THAN 
                   THEN 1
              ELSE 0 END
 END

执行SP时,我期望输出为

     EXEC SS 50, 150 //OUTPUT should be 80 and 125
     EXEC SS null, 150 //OUTPUT should be 0, 80 and 125
     EXEC SS 50, null//OUTPUT should be 80 and 125, 725

但是我得到的是所有四个AMT列值,谁能指出我的问题所在。预先感谢。

2 个答案:

答案 0 :(得分:0)

我认为您可以使用以下查询来简化:

 SELECT ID, AMT FROM TABLE
 WHERE (@AMT_GREATER_THAN IS NOT NULL AND @AMT_LESS_THAN IS NOT 
           NULL AND AMT BETWEEN @AMT_LESS_THAN AND @AMT_GREATER_THAN)
    OR (@AMT_GREATER_THAN IS NOT NULL AND AMT > @AMT_GREATER_THAN)
    OR (@AMT_LESS_THAN IS NOT NULL AND AMT < @AMT_LESS_THAN)

答案 1 :(得分:0)

跳过case 表达式,改用and / or

 SELECT ID, AMT FROM TABLE
 WHERE (AMT < @AMT_GREATER_THAN  OR  @AMT_GREATER_THAN IS NULL)
   AND (AMT > @AMT_LESS_THAN     OR  @AMT_LESS_THAN IS NULL)

也许您想要>=<=? (GREATER_THANLESS_THAN名称在查询中的作用相反。哪个值更高?)