还有选项,当一个失败时停止评估



我有一个读取项目的 SQL select 语句。显示项目是有条件的,但是当一个条件失败时,我不需要检查另一个条件。

例如: 其中像"M%"这样的项目 和 item_class='B' 和 fGetOnHand(item)>0

如果前 2 个中的任何一个失败,我不想做最后一个(调用用户定义的函数)。

根据我在这个网站上读到的内容,SQL Server的ANDOR运算符遵循短路行为。 这意味着,如果其他条件之一首先发生并失败,则对 UDF 的调用可能首先发生,或者可能根本不发生。

我们也许可以尝试使用CASE表达式重写您的逻辑,其中执行顺序是固定的:

WHERE
CASE WHEN item NOT LIKE 'M%' OR item_class <> 'B'
THEN 0
WHEN fGetOnHand(item) <= 0
THEN 0
ELSE 1 END = 1

上述逻辑强制首先对itemitem_class进行检查。 如果任一失败,则CASE表达式的第一个分支的计算结果为 0,并且条件失败。 只有当这两项检查都通过时,才会评估 UDF。

这是非常冗长的,但如果 UDF 调用是一个严重的惩罚,那么也许如上所述的措辞WHERE子句值得权衡冗长的代码以获得更好的性能。