我如何在where子句中使用If Else

时间:2019-11-11 09:25:12

标签: sql oracle plsql

在一个存储过程中,我想基于输入参数in_customerid获取客户列表,如果输入的customerid不为null或0,则获取所有customerId等于in_customerid的客户,否则选择所有客户。

我在这里尝试了代码,并使用了case语句

select * from Customer
WHERE (IF in_customerId = 0 OR  in_customerId IS NULL 
   THEN customerId>0
   ELSE
    customerId=in_customerId
  END IF)
  

如果输入的customerid不为null或0,则获取所有客户   其中customerId等于in_customerid,否则全选   客户。

3 个答案:

答案 0 :(得分:1)

您的代码几乎就在那里。尝试以下方法:

SELECT  *
  FROM  Customer
  WHERE ((in_customerId IS NULL OR in_customerId = 0) OR
        (in_customerId IS NOT NULL AND in_customerId <> 0 AND customerId = in_customerId))

这将返回所有in_customerId参数为NULL的客户。

对于in_customerId具有值的情况,它将仅返回匹配的行。

答案 1 :(得分:1)

您可以使用CASE .. WHEN表达式,因为在此处传递的参数为null或0的情况下,您不需要任何条件,如下所示:

SELECT  *
FROM CUSTOMER
WHERE
    CUSTOMERID = CASE
        WHEN IN_CUSTOMERID = 0
             OR IN_CUSTOMERID IS NULL THEN CUSTOMERID
        ELSE IN_CUSTOMERID
    END;

干杯!

答案 2 :(得分:0)

您可以使用参数nvl()nvl(in_customerId,0)的{​​{1}}函数来组合in_customerId为null或零的情况:

SELECT * 
  FROM customer
 WHERE customerId = case when nvl(in_customerId,0) > 0 
                         then in_customerId 
                         else customerId 
                    end;

另一个选项将nvl2()函数与decode()一起使用:

SELECT * 
  FROM customer
 WHERE customerId =  decode( in_customerId, 0, customerId, 
                             nvl2(in_customerId,in_customerId,customerId) );

Demo