[英]How does Oracle perform OR condition validation?
在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
,那么它也会评估第二个条件吗?
数据库成本优化器将在构造查询执行时考虑许多因素。 可能最重要的是所讨论的列上存在索引。 它将根据测试的选择性决定顺序,并可以在不同的时间以不同的顺序执行它们。 由于SQL是声明性而非过程性语言,因此通常无法控制这些条件的评估方式。
您可以提供一些“提示”来建议特定的执行订单,但您可能会对性能产生负面影响。
在PL / SQL中,Oracle OR是另一个短路评估示例。 Oracle PL / SQL语言基础知识 (部分)
短路评估
在评估逻辑表达式时,PL / SQL使用短路评估 。 也就是说,PL / SQL一旦确定结果就会停止评估表达式。 因此,您可以编写可能导致错误的表达式。
然而,在普通的SQL中,或可能以任何顺序进行评估。 正如@JonHeller在评论中指出的那样,这个问题中的表达是安全的,如果将潜在的除法处理为0,则需要更加谨慎 。
让Oracle为您做出决定。 它大部分时间都会做出更好的决定。 在这种情况下,甚至有一个结构将null的测试与测试值结合起来。
更换
:age is null or age > :age
同
age > nvl(:age, age - 1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.