【问题标题】:Oracle/general sql - are all where conditions always checked?Oracle/通用 sql - 是否总是检查条件?
【发布时间】:2020-12-03 03:53:47
【问题描述】:

有一个查询是这样的:

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

【问题讨论】:

  • Oracle 将可能仅在 WheelCount <= 0 或 NULL 所在的行上调用该函数。它有一个非常好的优化器。

标签: sql oracle case where-clause sql-function


【解决方案1】:

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

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

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

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

【讨论】:

  • “那个函数包含每次都应该执行的逻辑”——所以如果case短路,你不需要逆序搜索条件吗?
  • 感谢专线小巴的回答!并感谢@alex-poole 的回复,因为这两个我可以在我的环境中进行,并且问题已解决!
猜你喜欢
  • 2018-09-08
  • 2021-10-27
  • 2011-05-22
  • 2014-12-18
  • 2014-09-01
  • 2015-08-30
  • 2020-02-20
  • 1970-01-01
  • 2015-01-30
相关资源
最近更新 更多