Oracle/general sql - 是否始终检查所有条件?

Oracle/general sql - are all where conditions always checked?

有一个查询执行如下操作:

select * from cars c where c.WheelCount > 0 or CountWheels(c) > 0

函数 CountWheels 是针对每一行调用,还是仅针对 t.Count <= 0 所在的那些行调用?

问题是该函数包含每次都应该执行的逻辑——很可能是一个糟糕的设计;这是我几乎无法控制的代码的一部分。

这是一个简化的示例,我不能只写 select * from cars c where CountWheels(c.Body) > 0,因为那样会删除一些数据。把它想象成:给我所有曾经有轮子的汽车,即使其中一些现在可能有 0 个轮子。

Is the function CountWheels called for every row, or just for those rows where t.Count <= 0 ?

一般情况下,你不会选择这个。 SQL 是一种描述性语言,与过程性语言相对:您指定所需的结果,并相信优化器会选择最佳执行计划。

可能 尝试使用 case 表达式影响数据库,这可以更好地控制执行流程:

where case 
    when c.WheelCount   > 0 then 1
    when CountWheels(c) > 0 then 1
end = 1