Oracle如何执行OR条件验证?

时间:2015-12-14 04:44:36

标签: sql oracle logical-operators

在Java中,逻辑OR条件的行为使得如果第一个条件是true,则它不会评估第二个条件。

例如:

int a = 10;
if (a == 10 || a == 0) {
    // Logic
}

Java不评估第二个测试(a == 0),因为第一个条件(a == 10)是true

如果我们有这样的Oracle SQL语句:

select * from student where city = :city and 
    (:age is null or age > :age)

(age > :age or :age is null)如何评估?如果参数:ageNULL,那么它也会评估第二个条件吗?

3 个答案:

答案 0 :(得分:7)

数据库成本优化器将在构造查询执行时考虑许多因素。可能最重要的是所讨论的列上存在索引。它将根据测试的选择性决定顺序,并可以在不同的时间以不同的顺序执行它们。由于SQL是声明性而非过程性语言,因此通常无法控制这些条件的评估方式。

您可以提供一些“提示”来建议特定的执行订单,但您可能会对性能产生负面影响。

答案 1 :(得分:2)

PL / SQL

在PL / SQL中,Oracle OR是短路评估的另一个例子。 Oracle PL/SQL Language Fundamentals说(部分)

  

短路评估

     

在评估逻辑表达式时,PL / SQL使用短路评估。也就是说,PL / SQL一旦确定结果就会停止评估表达式。因此,您可以编写可能导致错误的表达式。

SQL

但是,在常规SQL中,可以按任意顺序评估OR 。正如@JonHeller在他的评论中指出的那样,这个问题中的表达是安全的,如果用0 处理潜在的除法,则需要更加谨慎。

答案 2 :(得分:1)

让Oracle为您做出决定。它大部分时间都会做出更好的决定。在这种情况下,甚至有一个结构将null的测试与测试值结合起来。

替换

:age is null or age > :age

使用

age > nvl(:age, age - 1)