Oracle10g 带有两个过滤器表达式的Cognos查询,或者可以按顺序执行?

Oracle10g 带有两个过滤器表达式的Cognos查询,或者可以按顺序执行?,oracle10g,where-clause,cognos,Oracle10g,Where Clause,Cognos,这是一个Cognos报告,它有一个交互式的多值提示p_prompt_参数 查询是用表格SQL编写的。为了使其成为someval列上的可选筛选器,报表编写器在查询的where子句中这样编写: ( 'NO INPUT' IN (#promptmany('P_prompt_param', 'String', sq('NO INPUT'))#) or table.somval IN (#promptmany('P_prompt_param', 'String'

这是一个Cognos报告,它有一个交互式的多值提示p_prompt_参数

查询是用表格SQL编写的。为了使其成为someval列上的可选筛选器,报表编写器在查询的where子句中这样编写:

( 
       'NO INPUT' IN (#promptmany('P_prompt_param', 'String', sq('NO INPUT'))#)
       or
       table.somval IN (#promptmany('P_prompt_param', 'String', sq('NO INPUT'))#)
      )
在本例中,table.somval的类型为NUMBER。如果未在输入页面的提示中选择值。报告将在具有相同DB模式的4个环境中返回,但有一个环境不起作用

相反,在一个异常值中,它会导致ORA-01722:无效数字

这是在Oracle 10.2.0.4上实现的

我一直在使用SQL,看看我是否可以在工作环境中重现它,如果我想象在没有输入选择的情况下promptmany宏将如何计算“no input”的defaultText值

这样的查询将得到ORA-01722

select * from mytable where ( someval in ('NO INPUT'));
Where作为这个查询,更像我报告中的上述Where子句,将不会

select * from mytable where ('NO INPUT' in ('NO INPUT') or someval in ('NO INPUT'));
是否有任何方法可以在第一个表达式返回true之后同时计算或表达式?或者,评估的顺序是否可能发生改变

Cognos或Oracle中是否有一些设置可能决定顺序,或者是否可以对这两个表达式进行计算?它可能以某种方式依赖于优化器吗


这是在Cognos ReportNet 1.1、Oracle10g上的,优化器可以自由地按其选择的顺序计算谓词。因此,可以在“NO-INPUT”谓词中的“NO-INPUT”之前自由地计算“NO-INPUT”谓词中的someval,在这种情况下,您将得到一个错误

如果someval是一个数字,它应该与一个数字进行比较,而不是一个字符串,因此我希望提示符应该被定义为一个数字,而No-Input选项应该是一个无效的数字,即-1。或者,在进行比较之前,可以将someval转换为字符串

to_char( someval ) IN ('NO INPUT')
将是不会引发运行时错误的有效语法。但是,如果您依赖于someval上的索引,则添加TO_字符将阻止使用该索引。您可以通过创建基于函数的索引来解决这个问题

CREATE INDEX fbi_tbl_someval
    ON mytable( to_char( someval ) );

但是,当表中的数据发生更改时,您可能需要维护两个不同的索引,两个索引占用磁盘空间等等。

这是有道理的,我担心是这样的,不知道他们为什么以这种方式构建所有报告。谢谢你的快速回复!