我正在尝试使用select大小写以便在SQL查询中使用where条件或不使用where条件。但这是行不通的,如果可以的话,我可以使用一些帮助来解决此问题
DECLARE @CategoryID Int
SET @CategoryID = 0
SELECT * FROM SomeTable
CASE WHEN @CategoryID = 0 THEN
ELSE
WHERE (dbo.SomeTable.ID = @CategoryID)
END
因此,如果我将0传递给@CategoryID
参数,则根本不应该过滤,否则我想过滤。能做到吗?
重新表达您的逻辑以删除CASE
表达式:
SELECT *
FROM SomeTable
WHERE @CategoryID IN (0, ID);
这是可行的,因为当@CategoryID = 0
时,WHERE
子句始终为true,否则,当ID = @CategoryID
时它将为true。
您当前的尝试是一个常见问题,这是由于未按预期使用CASE
表达式引起的。 CASE
表达式的predicate(即在THEN
和ELSE
之后的逻辑之后的内容)必须是literal值,而不是另一个逻辑表达式。在这种情况下,我们甚至不需要CASE
。
您的语法是错误的...您必须重新排列where
子句:
DECLARE @CategoryID Int = 0;
SELECT * FROM SomeTable
WHERE @CategoryID = 0 OR @CategoryID = ID
如果变量设置为0,则where
子句始终为true,否则,其值取决于条件@CategoryID = ID
这是可能的,首先是根据您的case
条件建立查询
DECLARE @CategoryID INT
SET @CategoryID = 0
declare @strsql varchar(max)
set @strsql =
CASE WHEN coalesce(@CategoryID, 0) = 0 THEN 'SELECT * FROM SomeTable'
ELSE
'SELECT * FROM SomeTable WHERE 1 = '+ cast(@CategoryID as varchar(10)) + ''
END
print @strsql
exec sp_executesql @strsql