2011-10-05 38 views
4

我想知道在存儲過程中實現「IF」條件的更好方法。如果改善查詢計劃重用的條件,首選的T-SQL方法

我見過這種方法廣泛使用。我喜歡這相當於迭代譯碼...

declare @boolExpression bit = 1 --True 

if @boolExpression = 1 
    select column from MyTable where group = 10 
else 
    select column from MyTable where group = 20 

使用一組爲基礎的方法...

declare @boolExpression bit = 1 --True 

select column from MyTable where group = 10 and @boolExpression =1 
union all 
select column from MYTable where group = 20 and @boolExpression =0 

我喜歡,因爲我瞭解使用此方法創建一個可重複使用查詢計劃和更少的計劃緩存流失。這是事實還是虛構?哪一個是正確的使用方法。

在此先感謝

+1

你是否錯過了第二個'UNION ALL'? –

+0

是的,謝謝Martin,UNION ALL丟失了。我將它添加到 –

回答

4

假設你缺少一個UNION ALL沒有在它很多,據我可以看到。第一個版本將緩存每個語句的計劃,作爲COND運算符的子元素,以便在執行時僅調用相關的語句。

Plan 1 screenshot

第二個將有兩個分支作爲連接運算符的孩子。這些過濾器具有啓動表達式謂詞,意思是每個尋道只在需要時才被評估。

Plan 2 screenshot

+0

位參數有1或0值,所以爲什麼結合時,其中一個選擇語句總是會返回0行? –

+1

@Adrian - 所以只返回一個結果集。而不是返回2個結果集 - 一個空的和一個包含數據。 –

+0

好的,我明白了,第一次當我看到這個技巧 –

0

你也可以按如下方式使用它:

DECLARE @boolExpression BIT = 1 

SELECT column FROM MyTable 
WHERE 
    CASE 
     WHEN @boolExpression = 1 THEN 
      CASE 
       WHEN group = 10 THEN 1 
       ELSE 0 
      END 
     ELSE 
      CASE 
       WHEN group = 20 THEN 1 
       ELSE 0 
      END 
    END = 1 

我知道這看起來複雜,但做的伎倆,尤其是在-情況下,當一個存儲過程的參數將被可選的。

+0

這是不可糾正的,並將掃描不尋求。 –

+0

@Martin Smith:感謝您的評論,我同意這將是一次掃描。只是想在WHERE子句中描述條件操作的另一種方式,因爲更容易維護更改,直到和除非性能成爲一個真正的問題,這可能會改變對象的實際需求/需求;這在問題中並不明確。 –

+0

我的眼睛正在澆水。 –