Sybase
where 條款短路?(sybase)
假設我們創建了一個具有可選輸入參數的儲存過程。
SQL是否會正確短路,從而使以下兩者的性能等效?
我問是因為我正在對自己的 proc 一個又一個建模,並且它使用後一種方法。知道這樣做是出於某種原因還是僅僅因為原作者沒有想到這一點會很有用。
select * from <complex join> where <various filters> and (value IS NULL OR myvalue = @value)
要麼
if (@value is not null) begin select * from <complex join> where <various filters> AND myvalue = @value end else begin select * from <complex join> where <various filters> end
通常,SQL 是聲明性的。也就是說,你說的是“你想要什麼”而不是“怎麼做”。這樣做的一個後果是您無法控制在同一邏輯處理步驟中處理或評估事物的順序(WHERE 子句或 GROUP BY 子句等是這些步驟)
也就是說,SQL 通常不會短路,因為該概念不適用。
當然有幾種情況(例如 SQL Server 和 CASE),但在您的範例中,您需要第二個選項來保證它。注意 SQL Server 對這種查詢進行了優化,但我假設 Sybase 沒有