Oracle /通用SQL-是否始终在所有条件检查位置?

问题描述

一个查询,它执行以下操作:

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个车轮。

解决方法

是对每行调用CountWheels函数,还是仅对t.Count

通常,您不会选择此选项。与过程语言相反,SQL是一种描述性语言:您指定所需的结果,并相信优化器可以选择最佳的执行计划。

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

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