Использование выражения CASE внутри предложения where - PullRequest
0 голосов
/ 24 октября 2019

У меня есть сохраненный процесс с 2 параметрами, оба целочисленные

Мне нужно использовать оператор case внутри условия where, но я не могу понять его правильно

where 
dbo.StockTransfer.BranchId = @branchId 
AND
CASE WHEN IsNumeric(@roleId) = 1 
THEN 
dbo.StockTransfer.StatusId !=12    
ELSE
dbo.StockTransfer.StatusId NOT in (12, 13)  
  END

order by dbo.StockTransfer.StatusId ASC

Я получаю ошибкув 'dbo.StockTransfer.StatusId! = 12'

Msg 102, уровень 15, состояние 1, процедура GetDeliveryList, строка 44 [строка запуска пакета 0]
неверный синтаксис рядом с '!'.

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Не беспокойся. Просто используйте обычную логику:

where dbo.StockTransfer.BranchId = @branchId and
      ( (IsNumeric(@roleId) = 1 and 
         dbo.StockTransfer.StatusId <> 12
        ) or
        (IsNumeric(@roleId) = 0 and
         dbo.StockTransfer.StatusId not in (12, 13)
        )
     ) 

Это не обрабатывает NULL значения, но это может быть легко добавлено.

На самом деле, я мог бы упростить это до:

where dbo.StockTransfer.BranchId = @branchId and
      dbo.StockTransfer.StatusId <> 12 and
      (IsNumeric(@roleId) = 1 or
       dbo.StockTransfer.StatusId <> 13
      )
0 голосов
/ 24 октября 2019

Учитывая последние комментарии о том, что вы хотите вернуть, я думаю, что это будет что-то вроде этого. Я добавил много пустого пространства для ясности в скобках.

where dbo.StockTransfer.BranchId = @branchId 
    AND 
    (
        ( 
            @roleId = 1
            AND
            StatusId in (13, 14)
        )
        OR
        (
            @roleId <> 1
            AND
            StatusId = 14
        )
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...