如何在T-SQL中使用条件

问题描述 投票:0回答:3

我正在尝试使用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参数,则根本不应该过滤,否则我想过滤。能做到吗?

sql-server conditional-statements case select-case
3个回答
2
投票

重新表达您的逻辑以删除CASE表达式:

SELECT *
FROM SomeTable
WHERE @CategoryID IN (0, ID);

这是可行的,因为当@CategoryID = 0时,WHERE子句始终为true,否则,当ID = @CategoryID时它将为true。

您当前的尝试是一个常见问题,这是由于未按预期使用CASE表达式引起的。 CASE表达式的predicate(即在THENELSE之后的逻辑之后的内容)必须是literal值,而不是另一个逻辑表达式。在这种情况下,我们甚至不需要CASE


0
投票

您的语法是错误的...您必须重新排列where子句:

DECLARE @CategoryID Int = 0;

SELECT * FROM SomeTable 
WHERE @CategoryID = 0 OR @CategoryID = ID

如果变量设置为0,则where子句始终为true,否则,其值取决于条件@CategoryID = ID


0
投票

这是可能的,首先是根据您的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
© www.soinside.com 2019 - 2024. All rights reserved.