ANDALSO选项,如果其中一个失败,则停止评估

时间:2019-05-14 15:26:10

标签: tsql where-clause

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

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

如果前两个失败,那么我不想做最后一个(对用户定义函数的调用)。

1 个答案:

答案 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子句,以牺牲冗长的代码来获得更好的性能。