許多現代編程語言都有短路布爾評估,如下列:現代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爲文檔參考 –