首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL WHERE子句是否计算短路?

SQL WHERE子句是否计算短路?
EN

Stack Overflow用户
提问于 2009-04-25 16:11:13
回答 11查看 56.4K关注 0票数 158

是SQL WHERE子句中的布尔表达式short-circuit evaluated

例如:

代码语言:javascript
复制
SELECT * 
FROM Table t 
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key) 

如果@key IS NULL的计算结果为true,则是否计算@key IS NOT NULL AND @key = t.Key

若否,原因为何?

如果是,是否有保证?它是ANSI SQL的一部分还是特定于数据库?

如果是特定于数据库的,SQLServer?甲骨文?MySQL?

EN

回答 11

Stack Overflow用户

发布于 2012-09-07 23:10:11

综上所述,短路并不是真正可用的。

如果您需要它,我建议使用Case语句:

代码语言:javascript
复制
Where Case when Expr1 then Expr2 else Expr3 end = desiredResult

始终计算Expr1,但每行只计算Expr2Expr3中的一个。

票数 62
EN

Stack Overflow用户

发布于 2009-04-25 16:43:56

我不相信SQL Server (2005)中的短路是有保证的。SQL Server通过其优化算法运行您的查询,该算法考虑了许多因素(索引、统计信息、表大小、资源等),以得出有效的执行计划。在评估之后,您不能肯定地说您的短路逻辑是有保证的。

不久前,我自己也遇到了同样的问题,我的研究真的没有给我一个明确的答案。您可能会编写一个小查询来证明它是有效的,但您是否可以确保,随着数据库负载的增加,表变得更大,数据库中的内容得到优化和更改,这一结论将成立。我不能,因此我犯了错误,在WHERE子句中使用了CASE来确保短路。

票数 12
EN

Stack Overflow用户

发布于 2009-04-25 23:58:48

你必须牢记数据库是如何工作的。在给定参数化查询的情况下,db基于该查询构建执行计划,而不使用参数值。无论实际提供的值是什么,每次运行查询时都会使用此查询。具有特定值的查询是否短路对执行计划无关紧要。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/789231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档