Как запустить определенное условие в предложении where запроса select на основе входного параметра? - PullRequest
2 голосов
/ 19 сентября 2019

Я пытаюсь, чтобы условие NVL работало на основе введенного параметра, но оно не работает с оператором CASE.Я не могу получить условие NVL (часы, 0)> 0 , когда мой параметр типа введен как 'часы' и наоборот

SELECT * 
FROM   hours_tbl 
WHERE  1=1 
AND 
       CASE 
              WHEN :type ='Hours' THEN Nvl(hours,0)>0 
              WHEN :type ='Earnings' THEN Nvl(hours,0)=0 
              ELSE Nvl(hours,0)>=0

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

CASE не делает то, что вы ожидаете.Он предназначен для присвоения значений, а не для создания условий.Я думаю, что вы хотите OR:

select * 
from hours_tbl 
where 
    1=1
    and (
        ( :type ='Hours' and nvl(hours, 0) > 0 )
        or ( :type ='Earnings' and nvl(hours, 0) =0 )
        or ( :type not in ('Hours','Earnings') and nvl(hours, 0) >= 0 )
    )

Примечание: как сообщается @ TonyAndrew , если :type может быть NULL, последнее выражение должно быть написано:

( nvl(:type,'x') not in ('Hours','Earnings') and nvl(hours, 0) >= 0 )
1 голос
/ 19 сентября 2019

Вы можете использовать оператор CASE, если вы сделаете это, чтобы вернуть значение, которое вы можете сравнить:

SELECT * 
FROM   hours_tbl 
WHERE  1=1 
AND    1=CASE 
           WHEN :type ='Hours' AND Nvl(hours,0)>0 THEN 1
           WHEN :type ='Earnings' AND Nvl(hours,0)=0 THEN 1 
           WHEN :type NOT IN ('Hours','Earnings') AND Nvl(hours,0)>=0 THEN 1
       END
...