1

由于以下代码打印了“第一”和“第二”插入该顺序,我可以得出结论,满足的第一个条件总是执行吗?

DECLARE @Constant1 int = 1
DECLARE @Constant2 int = 2

select 
     case 
          when @Constant1 = 1 
               then 'First'
          when @Constant1 = 1  and @Constant2 = 2
               then 'Second'               
     end as Result

select 
     case 
          when @Constant1 = 1  and @Constant2 = 2
               then 'Second'                    
          when @Constant1 = 1 
               then 'First'

     end as Result     

我知道有时并行处理会影响结果,我试图了解我在生产中看到的这种情况是否总是返回相同的结果。

此问题旨在了解生产代码中是否存在潜在问题。如果我要重新编写代码,我想我会尝试使代码明确互斥。

select 
     case 
          when @Constant1 = 1 and @Constant2 != 2
               then 'First'

          when @Constant1 = 1  and @Constant2 = 2
               then 'Second'                    

     end as Result     
4

1 回答 1

4

CASE各州的文档。

搜索到的 CASE 表达式:

  • 按指定顺序计算每个 WHEN 子句的 Boolean_expression。
  • 返回计算结果为 TRUE 的第一个 Boolean_expression 的 result_expression。
  • 如果没有 Boolean_expression 的计算结果为 TRUE,则如果指定了 ELSE 子句,数据库引擎将返回 else_result_expression,如果没有指定 ELSE 子句,则返回 NULL 值。

所以它将返回第一个真正的分支。

对于诸如问题中的简单查询,我希望它也不会评估其他分支。

此 DBA 站点问题中讨论了这种短路行为无法按预期/广告工作的一些情况。

即使第一个参数不是 NULL,SQL Server 是否会读取所有 COALESCE 函数?

但为了清楚起见,这些问题不会影响结果的从左到右的优先顺序(除了评估稍后的分支导致发生错误以致根本不返回结果的情况)

于 2013-10-21T16:23:30.050 回答