在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)
如何评估?如果参数:age
为NULL
,那么它也会评估第二个条件吗?
答案 0 :(得分:7)
数据库成本优化器将在构造查询执行时考虑许多因素。可能最重要的是所讨论的列上存在索引。它将根据测试的选择性决定顺序,并可以在不同的时间以不同的顺序执行它们。由于SQL是声明性而非过程性语言,因此通常无法控制这些条件的评估方式。
您可以提供一些“提示”来建议特定的执行订单,但您可能会对性能产生负面影响。
答案 1 :(得分:2)
在PL / SQL中,Oracle OR是短路评估的另一个例子。 Oracle PL/SQL Language Fundamentals说(部分)
短路评估
在评估逻辑表达式时,PL / SQL使用短路评估。也就是说,PL / SQL一旦确定结果就会停止评估表达式。因此,您可以编写可能导致错误的表达式。
但是,在常规SQL中,可以按任意顺序评估OR 。正如@JonHeller在他的评论中指出的那样,这个问题中的表达是安全的,如果用0 处理潜在的除法,则需要更加谨慎。
答案 2 :(得分:1)
让Oracle为您做出决定。它大部分时间都会做出更好的决定。在这种情况下,甚至有一个结构将null的测试与测试值结合起来。
替换
:age is null or age > :age
使用
age > nvl(:age, age - 1)