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 个轮子。
函数 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)