在WHERE子句中添加CASE WHEN

时间:2018-11-01 15:28:14

标签: sql oracle

我使用了以下WHERE子句

WHERE (TYPE1 = :P3_ITEM1 OR :P3_ITEM1 IS NULL)

过滤我对TYPE1的查询,当页面项P3_ITEM1不为null时,可以很好地显示相同TYPE1的记录。

现在,我需要为TYPE2和TYPE3添加两个过滤器。通常只有一个页面项P3_ITEM1,P3_ITEM2或P3_ITEM3不为空,因此我需要对不为空的任何一个进行过滤。

我尝试了

WHERE (TYPE1=:P3_ITEM1 OR :P3_ITEM1 IS NULL) OR
  (TYPE2=:P3_ITEM2 OR :P3_ITEM2 IS NULL) OR
  (TYPE3=:P3_ITEM3 OR :P3_ITEM3 IS NULL) 

但是没有用。

我尝试在WHERE子句中使用CASE语句,但到目前为止没有成功。有人可以帮忙吗?

WHERE CASE
WHEN (:P3_ITEM1 IS NOT NULL) THEN (TYPE1=:P3_ITEM1)
WHEN (:P3_ITEM2 IS NOT NULL) THEN (TYPE2=:P3_ITEM2)
WHEN (:P3_ITEM3 IS NOT NULL) THEN (TYPE3=:P3_ITEM3)

1 个答案:

答案 0 :(得分:1)

您可以简单地使用AND组合各种过滤器。如果每个过滤器的参数为NULL,则计算结果为true,因此,如果所有三个过滤器均为NULL,则将获得所有记录,但您可以填写任意一个,甚至所有三个参数来过滤掉不需要的记录。

WHERE
  (TYPE1 = :P3_ITEM1 OR :P3_ITEM1 IS NULL) AND
  (TYPE2 = :P3_ITEM2 OR :P3_ITEM2 IS NULL) AND
  (TYPE3 = :P3_ITEM3 OR :P3_ITEM3 IS NULL)