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
有一个查询执行如下操作:
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