我有一个读取项目的 SQL select 语句。显示项目是有条件的,但是当一个条件失败时,我不需要检查另一个条件。
例如: 其中像"M%"这样的项目 和 item_class='B' 和 fGetOnHand(item)>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
子句值得权衡冗长的代码以获得更好的性能。