许多现代编程语言都有短路布尔评估,如下列:现代DBMS是否包含短路布尔评估?
if (x() OR y())
如果x()
返回true,y()
不会求。
现代DBMS(SQL Server,Sybase,Oracle,DB2等)上的SQL是否具有此属性?
特别是如果布尔语句的左边是一个布尔常量,它会被短路吗?
相关:Do all programming languages have boolean short-circuit evaluation?
许多现代编程语言都有短路布尔评估,如下列:现代DBMS是否包含短路布尔评估?
if (x() OR y())
如果x()
返回true,y()
不会求。
现代DBMS(SQL Server,Sybase,Oracle,DB2等)上的SQL是否具有此属性?
特别是如果布尔语句的左边是一个布尔常量,它会被短路吗?
相关:Do all programming languages have boolean short-circuit evaluation?
是,也不是。
(下面是指专门SQL Server
)
一些运营商短路,有些则没有。 OR
CAN短路,但可能不取决于查询引擎选择的操作顺序。
CASE
是(我相信)100%保证短路。
您也可以尝试强制评估以便与嵌套的括号,如:
IF ((X) OR Y)
但我还不能肯定这是始终保持一致要么。
SQL在这方面的麻烦是声明式的,实际的逻辑是由引擎执行的。事实上,从您的示例中首先检查Y
可能更有效,然后检查X
- 例如,如果Y
已编入索引,并且X
需要表扫描。
对于参考:
从ANSI-SQL文档from this answer:
当优先级不被格式或通过 括号来确定,表达式的有效的评价通常是 从左侧进行向右。然而,它是依赖于实现 是否表述实际上是从左向右计算的,特别是 当操作数或操作可能导致条件得到提升,或者如果 表达式的结果,而不完全 评估的所有部分确定表达。
专门针对SQL Server的说法 - 排序。
在您指定或声明不能保证短路,因为优化器可以重新排序随意他们,如果感觉较好的性能增益可以通过这样进行排序。
但是,底层引擎本身可能会发生短路。这只是用户无法控制的东西。
下面的文章(该链接到其他优秀的讨论/资源)有更多关于这个话题:http://weblogs.sqlteam.com/jeffs/archive/2008/02/22/sql-server-short-circuit.aspx
这也是出于同样的原因的PostgreSQL [http://www.postgresql.org/docs/9.1/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL]也是如此。 – SingleNegationElimination
案不是SQL,所以我不知道如何应用。 (这是在T - SQL虽然) –
@比利 - 好点,我在答案的开头添加了一个警告。 – JNK
1为文档参考 –