Oracle/general sql - 是否总是检查条件?

ava*_*e70 2 sql oracle case sql-function where-clause

有一个查询,它做这样的事情:

select * from cars c where c.WheelCount > 0 or CountWheels(c) > 0
Run Code Online (Sandbox Code Playgroud)

该函数是CountWheels为每一行调用,还是只为那些行调用t.Count <= 0

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

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

GMB*_*GMB 6

函数 CountWheels 是为每一行调用,还是只为那些 t.Count <= 0 的行调用?

一般来说,你不能选择这个。SQL 是一种描述性语言,与过程语言相反:您指定想要的结果,并且您相信优化器会选择最佳的执行计划。

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

where case 
    when c.WheelCount   > 0 then 1
    when CountWheels(c) > 0 then 1
end = 1
Run Code Online (Sandbox Code Playgroud)

  • “该函数包含每次都应执行的逻辑” - 因此,如果发生短路,您不需要按相反顺序搜索条件吗? (2认同)