2014-08-27 53 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])) 

)