Как использовать условие в T-SQL - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь использовать регистр выбора, чтобы использовать условие where или нет в запросе sql. Но это не работает, и я могу использовать некоторую помощь, чтобы решить эту проблему, если это возможно

DECLARE @CategoryID Int
SET @CategoryID = 0
SELECT * FROM SomeTable 
CASE WHEN @CategoryID = 0 THEN 
ELSE
WHERE        (dbo.SomeTable.ID = @CategoryID)
END

Так что, если я передаю 0 параметру @CategoryID, я не должен фильтровать вообще, иначе я хочу фильтровать. Можно ли это сделать?

Ответы [ 2 ]

4 голосов
/ 16 октября 2019

Перефразируйте логику, чтобы удалить выражение CASE:

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

Это работает, потому что когда @CategoryID = 0, предложение WHERE всегда истинно, в противном случае оно будет истинным, когда ID = @CategoryID.

Ваша текущая попытка является распространенной проблемой, обусловленной тем, что вы не используете выражение CASE по назначению. Предикат выражения CASE (т. Е. Того, что следует за логикой после THEN и ELSE) должен представлять собой значение литерал , а не другое логическое выражение. В этом случае нам даже не нужно CASE.

0 голосов
/ 16 октября 2019

Это возможно, во-первых, вы должны построить свой запрос на основе вашего 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
...