【问题标题】:ANDALSO options, stop evaluating when one failsANDALSO 选项,当一个失败时停止评估
【发布时间】:2019-05-14 15:26:09
【问题描述】:

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

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

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

【问题讨论】:

  • From this SO question 似乎 AND 和 OR 都 not 遵循我们期望在 C# 或 Java 等应用程序语言中看到的短路行为。但是,我不会将此问题标记为重复,因为您还要求一种解决方法以避免调用 UDF。

标签: tsql where-clause


【解决方案1】:

根据我在本网站上阅读的内容,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 子句将值得牺牲冗长的代码以获得更好的性能。

【讨论】:

  • 完美。通过制作 case 语句,查询从 25 秒以上缩短到 4 秒
猜你喜欢
  • 2015-09-12
  • 2021-03-26
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2019-12-05
  • 1970-01-01
相关资源
最近更新 更多