首页 > 解决方案 > 将 CASE WHEN 添加到 WHERE 子句

问题描述

我使用了以下WHERE子句

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

过滤我对 TYPE1 的查询,当页面项目 P3_ITEM1 不为空时,它可以很好地显示相同 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)

标签: sqloracle

解决方案


您可以简单地使用AND来组合各种过滤器。如果参数为 ,则每个过滤器都将评估为 true NULL,因此如果所有三个参数都为 ,则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)

推荐阅读