Как вычислить переменную с помощью IF или CASE в предложении WHERE - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть ситуация, когда, если входная переменная равна определенной строке, я хочу оценить условие, а если нет, то меня это не волнует.

Я пытался сделать это как с IF, так и с CASE, но получил неверные синтаксические ошибки. Может быть, это невозможно, или, возможно, у меня не все скобки в нужных местах?

    Declare @state nvarchar(255) = 'KY'
,@group nvarchar(255) = 'COM'

SELECT * from business_auth
where (case when @group = 'COM'
            then (@state = AddressState or AddressState is null)
            else 1=1
            end)

Я хочу, чтобы он посмотрел на столбец состояния, если группа COM, но для любой другой группы. Я не забочусь о состоянии. У меня здесь также есть длинный список других оценок AND, поэтому я бы предпочел не переписывать все целиком или ставить IF перед запросом, и иметь в процедуре две версии запроса, одно состояние оценкии один не делает этого. Кажется, что было бы более красноречивое решение, но если нет, я пойду с этим.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Вы можете сделать это без динамического SQL:


SELECT * from business_auth
where (@group = 'COM' AND (@state = AddressState or AddressState is null))
      OR NOT (@group = 'COM')      

0 голосов
/ 08 ноября 2019

Похоже, вам лучше использовать динамический SQL:

DECLARE @state nvarchar(255) = N'KY',
        @group nvarchar(255) = N'COM';


DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = N'SELECT *' + @CRLF +
           N' FROM dbo.business_auth' +
           CASE WHEN @group = 'COM' THEN @CRLF + N'WHERE @state = AddressState OR AddressState IS NULL' ELSE N'' END + N';';

EXEC sp_executesql @SQL, N'@state nvarchar(255)', @State;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...