繁体   English   中英

Oracle如何执行OR条件验证?

[英]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)评估? 如果参数:ageNULL ,那么它也会评估第二个条件吗?

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

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

PL / SQL

在PL / SQL中,Oracle OR是另一个短路评估示例。 Oracle PL / SQL语言基础知识 (部分)

短路评估

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM