SQL SP - оператор Case в предложении Where - PullRequest
0 голосов
/ 15 ноября 2018

В следующей таблице

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

Я хочу использовать оператор case в предложении where для фильтрации результатов на основе двух входных параметров для моего сохраненного процесса.Вот как выглядит мой 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 голосов
/ 15 ноября 2018

Пропустить выражение 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_THAN и LESS_THAN действуют в вашем запросе противоположно. Какое из них имеет более высокое значение?)

0 голосов
/ 15 ноября 2018

Я думаю, что вы можете использовать запрос ниже, чтобы упростить:

 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)
...