【问题标题】:Adding CASE WHEN to WHERE clause将 CASE WHEN 添加到 WHERE 子句
【发布时间】:2019-04-05 20:37:34
【问题描述】:

我使用了以下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)

【问题讨论】:

标签: sql oracle


【解决方案1】:

您可以简单地使用AND 来组合各种过滤器。如果每个过滤器的参数为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)

【讨论】:

  • 成功了!我不知道为什么我认为将 OR 更改为 AND 将不起作用!谢谢
猜你喜欢
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多