Sql WHERE语句中的CASE语句
您好, 我希望在我的where声明中包含案例声明,如下所示: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”语句中不起
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'
如果这是针对大量行的,那么您可能需要小心所有这些备选方案的计划缓存问题,并将其划分为两个备选语句