Tsql 还有一些选择,当一个失败时停止评估

Tsql 还有一些选择,当一个失败时停止评估,tsql,where-clause,Tsql,Where Clause,我有一个SQL select语句来读取项。有条件显示项目,但当一个条件失败时,我不需要检查另一个 例如: 如“M%”之类的项目 和项目_class='B' 和fGetOnHand(项目)>0 如果前两个中的任何一个失败,我不想做最后一个(调用用户定义的函数)。从我在本网站上读到的内容来看,SQL Server的和和或操作员不会遵循短路行为。这意味着对UDF的调用可能首先发生,或者如果其他条件之一首先发生并失败,则可能根本不会发生 我们可以尝试使用CASE表达式重写逻辑,其中执行顺序是固定的: W

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

例如: 如“M%”之类的项目 和项目_class='B' 和fGetOnHand(项目)>0


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

从我在本网站上读到的内容来看,SQL Server的
操作员不会遵循短路行为。这意味着对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
在哪里
项目与“M%”或“B”类项目不同时的情况
然后0

当fGetOnHand(item)出现时,AND和OR似乎都不遵循短路行为,这在C#或Java等应用程序语言中是可以看到的。但是,我不会将这个问题标记为重复,因为您还要求提供一种解决方法,以避免调用UDF.PERFECT。通过制作case语句,查询从25秒多增加到4秒