2016-03-07 29 views
5

有沒有什麼方法可以明確說明WHERE條件發生的順序?我認識到,查詢優化器將着眼於在WHERE子句中的所有部分,以確定最有效的方式來滿足查詢,因爲在這些答案中指出:Sql - WHERE條件的顯式順序?

Does order of where clauses matter in SQL

SQL - Does the order of WHERE conditions matter?

然而,有無法檢查其他條件依賴的條件嗎?答案之一來自這些線程倒是我後,但不提供一個解決方案:

select * 
from INFORMATION_SCHEMA.TABLES 
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0 

這可能會失敗,因爲CAST能夠確定table_name的字段是否是數字之前評估(因此拋出無效投射錯誤)。

當然,必須有辦法實現這個目標嗎?

回答

4

使用派生表這樣:

SELECT* 
FROM(
    select * 
    from INFORMATION_SCHEMA.TABLES 
    where ISNUMERIC(table_name) = 1 
) AS i 
WHERE CAST(table_name as int) <> 0 

另外,爲了最有可能的運行,你可以使用一個CASE語句:

select * 
from INFORMATION_SCHEMA.TABLES 
where 0<>(CASE WHEN ISNUMERIC(table_name) = 1 
      THEN CAST(table_name as int) 
      ELSE 0 END) 

應當指出的是, SQL Server(我已經用過的唯一RDBMS)存在CASE技巧會失敗的情況。請參閱documentation on CASE, Remarks

CASE語句按順序評估其條件,並停止滿足條件滿足的第一個條件。 在某些情況下,在CASE語句接收表達式的結果作爲其輸入之前,將對錶達式求值。評估這些表達式的錯誤是可能的。首先評估出現在CASE語句的WHEN參數中的聚合表達式,然後將其提供給CASE語句。例如,當生成MAX聚合的值時,以下查詢產生除零錯誤。這發生在評估CASE表達式之前。

WITH Data (value) AS 
( 
SELECT 0 
UNION ALL 
SELECT 1 
) 
SELECT 
    CASE 
     WHEN MIN(value) <= 0 THEN 0 
     WHEN MAX(1/value) >= 100 THEN 1 
    END 
FROM Data ; 

我懷疑這也可能是其他RDBMS實現真實的。

+1

不漂亮,但我會接受。謝謝! – McFixit

1

我認爲,如果評估可以短路你問 - 它可能有助於閱讀:

Is the SQL WHERE clause short-circuit evaluated?

所以,你可能需要在嘗試前一秒來評價的首要條件。在MSSQL中,你可以使用CTE來完成第一個。或者,另一個選擇可能是使用CASE在特定條件下僅執行第二個。