0

考虑如下查询:

select * from <table_name>
where <condition1> and <condition2> and <condition3>;

假设 Oracle 执行条件(任何条件),如果不为真,则不执行其他条件。因此,如果我有其他具有逻辑错误的条件,则不会抛出它。例如:

select count(*) from dual 
where 1=0 and 
'stack' = SUBSTR('stackoverflow','k', 3);

Oracle 返回 0。现在去掉 1=0 条件,我们得到ORA-01722: invalid number.

我知道 Oracle 会进行成本优化并决定条件执行的顺序。那么如何覆盖它并使其执行所有条件,以便引发错误而不是误导性输出?我们可以使用提示吗?我是提示概念的新手,所以一些例子会很棒。

4

4 回答 4

1

我不知道这是否可以解决您的“问题”,但这是一种方法。此查询或多或少等同于您的查询,并引发错误。

SQL> with t as (
  2  select /*+ materialize */ * from   dual
  3   where  'stack' = substr('stackoverflow', 'k', 3)
  4  )
  5  select * from t where 1 = 0;
 where  'stack' = substr('stackoverflow', 'k', 3)
                                          *
ERROR at line 3:
ORA-01722: invalid number

然而不能保证。materialize只是一个提示,因此可能不会被遵守。

于 2016-12-21T10:12:14.057 回答
0

您可以逐一检查条件,也可以简单地使用OR关键字仅检查错误。

    select count(*) from dual 
    where 'stack' = SUBSTR('stackoverflow',1,5) and  1=0
   --  True and False return 0


    select count(*) from dual 
    where 'stack' = SUBSTR('stackoverflow','a',5) and  1=0
    --  True and False  return 0


   select count(*) from dual 
   where 'stack' = SUBSTR('stackoverflow',1,5) and  1=1
   --  True and True Return 1

这里 oracle 首先检查错误的条件 1=0 然后它不检查另一个条件,该条件也有逻辑错误,如 substr 语法中的无效数字 'a'。

于 2016-12-21T07:00:57.273 回答
0

XY 问题是询问您尝试的解决方案,而不是您的实际问题。这会导致大量时间和精力的浪费,无论是在寻求帮助的人方面,还是在提供帮助的人方面。

xyproblem.info


供参考

曾经有一个 ORDERED_PREDICATES 提示
Optimizer Hints

这在 10g 中已被弃用
Oracle 性能有哪些新增功能?

于 2016-12-21T07:10:06.973 回答
0
select  *

from    <table_name>

where   case 
            when    <condition1> 
            then    case
                        when    <condition2> 
                        then    case
                                    when    <condition3>
                                    then    1
                                end
                    end
        end = 1
于 2016-12-21T09:00:12.600 回答