使用多个条件AND / OR的效果

时间:2018-06-19 14:28:54

标签: sql oracle

以某些特定顺序使用多个条件是否方便?

我创建了以下函数,该函数接收每个参数的值,将其打印在屏幕上(OUTPUT),然后返回:

CREATE OR REPLACE FUNCTION jmo_imp (p_value VARCHAR2)
RETURN VARCHAR2 IS
BEGIN
  dbms_output.put_line(p_value);
  RETURN p_value;
END;
/

因此,下一个查询返回45,同时在屏幕上显示45(输出):

SELECT jmo_imp(45) FROM dual
/

如果我使用由运算符“ AND”或运算符“ OR”分隔的多个条件,则会在屏幕上显示以下结果(输出):

SELECT 'Hello'
  FROM dual
 WHERE slu.jmo_imp('WHERE1') = 'WHERE1'
   AND slu.jmo_imp('WHERE2') = 'WHERE2'
   AND slu.jmo_imp('WHERE3') = 'WHERE3'
/

WHERE3
WHERE2
WHERE1

SELECT *
  FROM (SELECT 1 col FROM dual
        UNION
        SELECT 2 col FROM dual
        UNION
        SELECT 3 col FROM dual
        UNION
        SELECT 4 col FROM dual)
 WHERE slu.jmo_imp(col) = 4
    OR slu.jmo_imp(col) = 3
    OR slu.jmo_imp(col) = 2
    OR slu.jmo_imp(col) = 1
/

1
1
1
1
2
2
2
3
3
4

这意味着,每当有多个条件由运算符“ AND”分​​隔时,我都应在末尾使用“最可能的”,如果我有多个条件由运算符“ OR”分隔,则应将“最可能的”在一开始?还是两者之间的差异如此之小,以至于当前的Oracle版本都没有注意到这一点? (“最可能发生的情况是,我们知道/假设的一个条件比其他条件更正确,因此我们将避免评估其他条件)。

谢谢!!

1 个答案:

答案 0 :(得分:4)

请参阅文档:Condition Precedence

  

在评估包含多个条件的表达式时,Oracle   在评估那些条件之前先评估优先级更高的条件   优先级较低。 Oracle评估条件相等   表达式中从左到右的优先级,如下   例外:

     
      
  • 在多种情况下无法保证从左到右的评估   使用AND连接

  •   
  • 在多种情况下无法保证从左到右的评估   使用OR

  • 连接   

根据以上所述,条件在WHERE子句中的顺序无关紧要,不保证该评估顺序,Oracle可以自由地以任何顺序评估与OR和AND运算符相关的条件。
即使当前测试显示顺序为3、2、1,也不能保证Oracle不会更改此顺序。