Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Sql WHERE语句中的CASE语句_Sql_Sql Server - Fatal编程技术网

Sql WHERE语句中的CASE语句

Sql WHERE语句中的CASE语句,sql,sql-server,Sql,Sql Server,您好, 我希望在我的where声明中包含案例声明,如下所示: SELECT a1.ROWGUID FROM Table1 a1 INNER JOIN Table2 a2 on a1.ROWGUID=a2.Table1ROWGUID WHERE a1.Title='title' AND (CASE WHEN @variable is not null THEN a1.ROWGUID in (SELECT * FROM #TempTable)) 但是,此“CASE”语句在“WHERE”语句中不起

您好, 我希望在我的where声明中包含案例声明,如下所示:

SELECT a1.ROWGUID FROM Table1 a1
INNER JOIN Table2 a2 on a1.ROWGUID=a2.Table1ROWGUID
WHERE a1.Title='title' 
AND (CASE WHEN @variable is not null THEN a1.ROWGUID in (SELECT * FROM #TempTable))
但是,此“CASE”语句在“WHERE”语句中不起作用。
我该如何纠正呢?

您缺少了一个结尾,可能还有一个其他的:

(CASE WHEN @variable is not null THEN a1.ROWGUID ELSE ... END)

您缺少结尾,可能还缺少其他内容:

(CASE WHEN @variable is not null THEN a1.ROWGUID ELSE ... END)

您需要这样做:

WHERE   a1.Title = 'title
AND     (@variable IS NULL
OR      a1.ROWGUID IN (SELECT * FROM #TempTable))

我只是略作猜测,因为您的案例陈述不完整。

您需要这样做:

WHERE   a1.Title = 'title
AND     (@variable IS NULL
OR      a1.ROWGUID IN (SELECT * FROM #TempTable))

我只是略作猜测,因为您的case语句不完整。

case语句用于返回变量,而不是计算谓词

所以你可以

WHERE CASE WHEN @test1 = 'valuea' THEN 1 ELSE 2 END = MyTestColumn
将1或2与基于某个变量(或其他列)的列进行比较,但不要以您尝试过的方式进行比较


David M的答案是正确的方法,可以执行您需要执行的操作。

使用
CASE
语句返回变量,而不是计算谓词

所以你可以

WHERE CASE WHEN @test1 = 'valuea' THEN 1 ELSE 2 END = MyTestColumn
将1或2与基于某个变量(或其他列)的列进行比较,但不要以您尝试过的方式进行比较

David M的答案是做你需要做的事情的正确方法。

另一种选择

SELECT a1.ROWGUID FROM Table1 a1
INNER JOIN Table2 a2 on a1.ROWGUID=a2.Table1ROWGUID
INNER JOIN #TempTable ON  (@variable is null) OR #TempTable.ROWGUID = a1.ROWGUID
WHERE a1.Title='title' 
如果这是针对大量行的,您可能需要小心所有这些备选方案的计划缓存问题,并将其划分为两个备选语句。

另一个备选方案

SELECT a1.ROWGUID FROM Table1 a1
INNER JOIN Table2 a2 on a1.ROWGUID=a2.Table1ROWGUID
INNER JOIN #TempTable ON  (@variable is null) OR #TempTable.ROWGUID = a1.ROWGUID
WHERE a1.Title='title' 
如果这是针对大量行的,那么您可能需要小心所有这些备选方案的计划缓存问题,并将其划分为两个备选语句