Sql Oracle如何执行或执行条件验证?

Sql Oracle如何执行或执行条件验证?,sql,oracle,logical-operators,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) 如何计算(

在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或:age为空)
?如果参数<代码>:年龄< /代码>是代码> null < /代码>,那么它是否也评估第二个条件?

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

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

PL/SQL 在PL/SQL中,Oracle OR是短路评估的另一个示例。甲骨文说(部分)

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

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

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

替换

:age is null or age > :age


谢谢你的回复。那么,你可以建议在sql下面写什么是最好的方法吗。(:age为null或age>:age)或(age>:age或:age为null)。大多数情况下:年龄是空的。我建议您在测试值之前测试
null
,因为它将首先计算为
true
。这对于PL/SQL是正确的,但对于Oracle SQL是不正确的。无法编写可能导致错误的表达式,因为无法依赖从左到右的短路计算。例如,请参见。虽然这个问题中的表达式是安全的,但如果处理0的潜在除法,则需要更加小心。@JonHeller谢谢。编辑。等效表达式是
age>nvl(:age,age-1)
,不是吗?无论如何,这是一个好建议:-)-1用更复杂的表达式替换表达式是一个非常糟糕的建议。如果您有OR表达式,Oracle会为您工作,还是Oracle会问您如何开发它?如果你现在引入一个函数(NVL),这个表达式对oracle来说真的很难优化。它现在必须对每一行进行逐行计算,以找出谓词的值。与此相反,如果:age为null,它不必计算任何行,如果age不为null,它将无法使用索引。使用子查询可能会影响计算顺序。
age > nvl(:age, age - 1)