Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL使用IF或CASE生成IN列表_Sql_If Statement - Fatal编程技术网

TSQL使用IF或CASE生成IN列表

TSQL使用IF或CASE生成IN列表,sql,if-statement,Sql,If Statement,我想更改SQL Server 2008R2上的存储过程。存储过程接受多个参数中的一个参数,该参数是ClientID。我想要实现的是这样的目标: 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

我想更改SQL Server 2008R2上的存储过程。存储过程接受多个参数中的一个参数,该参数是ClientID。我想要实现的是这样的目标:

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
 ClientID=@ClientID
)
我意识到上述内容离有效的SQL还有很长的路要走,但本质上我希望它能说明问题所在。基本上是存储过程的一个参数,如果0将触发一些sql以从IN语句中获取要查找的ID列表,并且如果该值大于0,则它是要查找的特定ID,因此对单个指定值进行简单的where子句筛选

因为这是一个存储过程,所以如果适用的话,执行一些预编码/sql来获取多个clientid的列表并不是问题。它不必出现在一个单独的语句中


有人对实现这一目标的最佳方法有什么想法吗

您只需正确嵌套where子句,如下所示:

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

您只需正确嵌套where子句,如下所示:

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

您可以使用以下组合

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

)

您可以使用以下组合

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

)

这完全取决于选择哪个子对象来获取适当的客户机ID列表,但是,您可以在子查询上执行一个IN。是否有可能0是有效的[ClientId]?对不起,应该说明,0不是有效的ClientID@Dimt那么,你的答案应该行得通。Dimt/Jodrell/Kiran Hedge,绝对完美,需要更多测试:非常感谢!非常值得赞赏的是,这取决于选择哪个子项来获得适当的客户机ID列表,但是,您可以在子查询中执行输入。是否有可能0是有效的[ClientId]?对不起,应该说明,0不是有效的ClientID@Dimt那么,你的答案应该行得通。Dimt/Jodrell/Kiran Hedge,绝对完美,需要更多测试:非常感谢!非常感谢