2014-08-27 66 views
1

我在SQL Server 2008R2上有一個存儲過程,我想更改它。 SPROC採用一個參數(許多中的一個),它是一個ClientID。我想實現的是這樣的:使用IF或CASE生成IN列表的TSQL

SELECT <lots of stuff> FROM TABLES 
<lots of joins> 
WHERE 
<a few where/and clauses> 
AND -- important bit here! 
( 
IF @ClientID=0 THEN ClientID IN (sub select to get a list of appropriate client ids) 
ELSE -- ClientID param is not 0 and therefore we passed in a single, specified ClientID 
[email protected] 
) 

我意識到上面的是有效的SQL很長的路要走,但本質上我希望它說明了這個問題。基本上,一個SPROC的參數,如果0將觸發一些sql來獲得一個ID列表(基本上是一個「IN」語句),如果該值大於0,那麼它是一個特定的ID (對一個指定的值進行簡單的where子句過濾)。

由於它是SPROC,因此通過執行一些預代碼/ sql來獲取多個ClientID列表(如果適用)不是問題。它不必在一個單一的聲明。

有人有任何想法來實現這個最好的方法嗎?

+0

它,而要看是什麼'子選擇來獲得適當的列表客戶端ID「是,但你可以在子查詢上做一個」IN「。有沒有可能'0'是一個有效的'[ClientId]'? – Jodrell 2014-08-27 08:50:47

+0

對不起,應該已經說清楚了,0不是有效的ClientID – Tifosi 2014-08-27 08:54:39

+0

@Dimt的答案應該可以正常工作。 – Jodrell 2014-08-27 09:01:33

回答

3

你只需要正確巢您的where子句一樣,如下所示:

WHERE 
... 
AND 
(
     @ClientID = 0 AND [ClientID] IN <sub select to get appropriate ids> 
    OR 
     [ClientID] = @ClientID 
) 
+0

對不起,如果你覺得我的編輯不是一個改進。 – Jodrell 2014-08-27 08:46:16

+0

@Jodrell它絕對好,看起來更清晰,謝謝。 – Dimt 2014-08-27 08:47:34

1

您可以使用下列組合

. 
. 
. 
AND 
(
    ((@ClientID=0 AND ClientID IN (sub select to get a list of appropriate client ids)) 
     OR 
    (@ClientID<>0 AND [email protected])) 

)