许多现代编程语言都有短路布尔评估,如下所示:
if (x() OR y())
如果x()
返回true,则永远不会评估y()
。
现代DBMS(SQL Server,Sybase,Oracle,DB2等)上的SQL是否具有此属性?
特别是如果布尔语句的左侧是布尔常量,它是否会被短路?
相关:Do all programming languages have boolean short-circuit evaluation?
答案 0 :(得分:1)
是和否。
(以下仅指SQL Server
)
有些运营商短路,有些运营商没有。 OR
CAN 短路,但可能不会取决于查询引擎选择的操作顺序。
CASE
(我相信)100%保证短路。
您还可以尝试使用嵌套括号强制评估顺序,例如:
IF ((X) OR Y)
但我不肯定这也是一贯的。
在这方面,SQL的问题在于它是声明性的,而实际的逻辑是由引擎执行的。实际上,从您的示例中首先检查Y
然后检查X
是否更有效 - 例如,Y
是否已编入索引且X
需要表格扫描。
供参考:
来自ANSI-SQL文档from this answer:
优先级不是由格式决定的 括号,表达式的有效评价一般 从左到右执行。但是,依赖于实现 表达式是否实际上从左到右进行了评估,尤其是 当操作数或运算符可能导致条件被提升或者是否 表达式的结果可以在没有完全确定的情况下确定 评估表达式的所有部分。
答案 1 :(得分:1)
专门针对SQL Server发言 - 等等。
您指定OR语句的顺序不能保证短路,因为如果通过这样做可以获得更好的性能提升,优化器可以随意重新排序。
然而,底层引擎本身可以并且将会短路。这只是用户无法控制的东西。
以下文章(链接到其他优秀的讨论/资源)在此主题上有更多内容:http://weblogs.sqlteam.com/jeffs/archive/2008/02/22/sql-server-short-circuit.aspx