以某些特定顺序使用多个条件是否方便?
我创建了以下函数,该函数接收每个参数的值,将其打印在屏幕上(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版本都没有注意到这一点? (“最可能发生的情况是,我们知道/假设的一个条件比其他条件更正确,因此我们将避免评估其他条件)。
谢谢!!
答案 0 :(得分:4)
请参阅文档:Condition Precedence
在评估包含多个条件的表达式时,Oracle 在评估那些条件之前先评估优先级更高的条件 优先级较低。 Oracle评估条件相等 表达式中从左到右的优先级,如下 例外:
在多种情况下无法保证从左到右的评估 使用AND连接
- 连接
在多种情况下无法保证从左到右的评估 使用OR
根据以上所述,条件在WHERE子句中的顺序无关紧要,不保证该评估顺序,Oracle可以自由地以任何顺序评估与OR和AND运算符相关的条件。
即使当前测试显示顺序为3、2、1,也不能保证Oracle不会更改此顺序。