由于下面的代码打印了那个顺序的'First'和'Second'INSERT,我能否断定满足的第一个条件总是被执行?
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
我知道有时并行处理会影响结果,我试图理解如果我在Production中看到的这种情况总是会返回相同的结果。
此问题旨在了解生产代码中是否存在潜在问题。如果我要重新编写代码,我想我会尝试使代码明确地互相排斥..
select
case
when @Constant1 = 1 and @Constant2 != 2
then 'First'
when @Constant1 = 1 and @Constant2 = 2
then 'Second'
end as Result
答案 0 :(得分:3)
CASE
州的文档。
搜索CASE表达式:
- 按照指定的顺序评估每个WHEN子句的Boolean_expression。
- 返回第一个求值为TRUE的Boolean_expression的result_expression。
- 如果没有Boolean_expression计算为TRUE,则数据库引擎会在指定ELSE子句时返回else_result_expression,或者 如果未指定ELSE子句,则为NULL值。
因此它将返回第一个真正的分支。
对于一个简单的查询,例如问题,我希望它不会评估其他分支。
此DBA网站问题中讨论了这种短路行为无法按预期/做广告的情况。
Does SQL Server read all of a COALESCE function even if the first argument is not NULL?
但是要清楚这些问题不会影响结果的从左到右的优先顺序(除了评估后来的分支导致发生错误以致根本没有返回结果的情况除外)