具有两个过滤器表达式的 Cognos 查询 或者可以无序执行?



这来自一个Cognos报告,它有一个交互式的多值提示符(P_prompt_param)。

查询是用tablesql编写的。为了使它成为列(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'))#)
      )

在本例中为表。somval的类型是NUMBER。如果您没有在输入页面上的提示符中选择一个值。报告将在4个具有相同DB模式的环境中返回,但有一个环境无法正常工作。

相反,在一个离群值中,结果是ORA-01722: invalid number

Oracle 10.2.0.4。

我一直在SQL中玩,看看我是否可以在"工作"环境中重现它,如果我想象#promptmany#宏将如何在没有选择输入(defaultttext值为' no input ')时进行评估。

这样的查询将得到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'));

是否有任何方法,OR表达式可以评估,即使在第一个返回真?或者是否有可能计算的顺序可以"切换"?

Cognos或Oracle中是否有一些设置可以决定顺序,或者两个表达式是否都可以求值?它会在某种程度上依赖于优化器吗?

这是在Cognos ReportNet 1.1, Oracle 10g上

优化器可以自由地按照它选择的顺序计算谓词。因此,在计算'NO INPUT' in ('NO INPUT')谓词之前计算someval in ('NO INPUT')谓词是自由的,在这种情况下,您将得到一个错误。

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

to_char( someval ) IN ('NO INPUT')

将是不会抛出运行时错误的有效语法。但是,如果您依赖于someval上的索引,添加TO_CHAR将阻止该索引被使用。您可以通过创建基于函数的索引

来解决这个问题。
CREATE INDEX fbi_tbl_someval
    ON mytable( to_char( someval ) );

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

相关内容

最新更新