Sql 现代DBMS是否包含短路布尔计算?

Sql 现代DBMS是否包含短路布尔计算?,sql,database,optimization,Sql,Database,Optimization,许多现代编程语言具有短路布尔求值,例如: if (x() OR y()) 如果x()返回true,则永远不会计算y() 现代DBMS(SQL Server、Sybase、Oracle、DB2等)上的SQL是否具有此属性? 特别是,如果布尔语句的左侧是布尔常量,它会短路吗 相关:是和否 (以下仅指SQL Server) 有些操作员短路,有些操作员不短路或可以短路,但可能不取决于查询引擎选择的操作顺序 CASE是(我相信)100%保证短路的 还可以尝试使用嵌套括号强制计算顺序,如: IF((X)

许多现代编程语言具有短路布尔求值,例如:

if (x() OR y())
如果
x()
返回true,则永远不会计算
y()

现代DBMS(SQL Server、Sybase、Oracle、DB2等)上的SQL是否具有此属性?

特别是,如果布尔语句的左侧是布尔常量,它会短路吗


相关:

是和否

(以下仅指
SQL Server

有些操作员短路,有些操作员不短路
可以短路,但可能不取决于查询引擎选择的操作顺序

CASE
是(我相信)100%保证短路的

还可以尝试使用嵌套括号强制计算顺序,如:

IF((X)或Y)

但我不确定这是否总是一致的

SQL在这方面的问题在于它是声明性的,而实际的逻辑是由引擎执行的。事实上,首先从您的示例中检查
Y
,然后检查
X
——例如,如果
Y
已编制索引且
X
需要表格扫描,则可能更有效

供参考:

来自ANSI-SQL文档

如果优先级不是由格式或 括号中,表达式的有效计算通常是 从左到右执行。但是,它取决于实现 表达式是否实际从左到右求值,尤其是 当操作数或运算符可能导致引发条件时,或者 表达式的结果可以不完全确定 计算表达式的所有部分


专门针对SQL Server—有点像

指定OR语句的顺序不能保证短路,因为如果优化器认为这样做可以获得更好的性能收益,则可以随意对它们重新排序

但是,基础发动机本身可能也将短路。这是用户无法控制的


下面的文章(链接到其他优秀的讨论/参考资料)有更多关于这个主题的内容:

CASE不在SQL中,所以我不确定它是如何应用的。(不过是在t-sql中)@Billy-说得好,我在答案的开头加了一条警告。PostgreSQL也是如此[出于同样的原因]。