Oracle Apex - where 语句中的案例

Posted

技术标签:

【中文标题】Oracle Apex - where 语句中的案例【英文标题】:Oracle Apex - Case within a where statement 【发布时间】:2021-06-10 13:10:11 【问题描述】:

我在运行以下查询时遇到问题(交互式报告/简化了查询,因为我确定问题出在 case 语句上):

select 
v.manager_email 
from my_table  v
where 

(
case 
when :P28_ACT_AS_ROLE_H = 'Director' then v.director_email = :P28_ACT_AS_H 
when :P28_ACT_AS_ROLE_H = 'Admin'        then v.manager_email  = nvl(:P28_ACT_AS_H, 
v.manager_email)
when :P28_ACT_AS_ROLE_H = 'Manager'  then v.manager_email  = :P28_ACT_AS_H

end
)

错误是这个:ORA-20999。 有人知道为什么会这样吗? (:p28 项是通过计算计算出来的,并且可以完美运行)

谢谢!

【问题讨论】:

【参考方案1】:

当布尔逻辑足够时不要使用case

where (:P28_ACT_AS_ROLE_H = 'Director' and v.director_email = :P28_ACT_AS_H) or
      (:P28_ACT_AS_ROLE_H = 'Admin' and v.manager_email = nvl(:P28_ACT_AS_H, v.manager_email)) or
      (:P28_ACT_AS_ROLE_H = 'Manager' and v.manager_email  = :P28_ACT_AS_H)

您的示例中的具体原因是 Oracle 无法将布尔表达式识别为 case 的有效返回值,从而导致语法错误

【讨论】:

我还不知道它是如何工作的,但确实如此!谢谢!非常感谢【参考方案2】:

或者,CASE

where nvl(:P28_CT_AS_H, v.manager_email) =
      case when :P28_ACT_AS_ROLE_H = 'Director' then v.director_email
           when :P28_ACT_AS_ROLE_H = 'Admin'    then v.manager_email
           when :P28_ACT_AS_ROLE_H = 'Manager'  then v.manager_email
      end

【讨论】:

以上是关于Oracle Apex - where 语句中的案例的主要内容,如果未能解决你的问题,请参考以下文章

以 oracle apex 形式创建动态 where 子句

Oracle APEX - 数据库触发器中的 If 语句

Oracle APEX 中的条件值列表?

Oracle Apex 更新表的特定行

带有 IF ELSE 语句的 ORACLE APEX 引导 CSS

在 APEX 交互式报表中使用 in 语句