我有一条读取项目的SQL select语句。有条件显示哪些项目,但是当一个条件失败时,我不需要检查其他条件。
例如: 像“ M%”这样的项目 和item_class ='B' 和fGetOnHand(item)> 0
如果前两个失败,那么我不想做最后一个(对用户定义函数的调用)。
答案 0 :(得分:2)
根据我在该站点上所读到的内容,SQL Server的AND
和OR
运算符不是遵循短路行为。这意味着,如果其他条件之一先发生并且失败,则可能首先发生对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
以上逻辑会强制对item
和item_class
进行检查。如果其中一个失败,则CASE
表达式的第一个分支求值为0,并且条件失败。只有这两项检查都通过,UDF才会被评估。
这非常冗长,但是如果UDF调用是一个严重的惩罚,那么也许应该像上面这样声明WHERE
子句,以牺牲冗长的代码来获得更好的性能。