Получение ошибки с выражением CASE с использованием предложения WHERE

declare @SP nvarchar(3)

SELECT HDR.SOPNUMBE, HDR.docdate, HDR.pymtrmid, 
RTRIM(HDR.ShipToName) +
CASE WHEN HDR.ADDRESS1 <> '' THEN char(10) + RTRIM(HDR.ADDRESS1) ELSE '' END 
FROM vSOPHdr HDR
WHERE HDR.SOPTYPE = 2 AND 
(CASE WHEN HDR.SLPRSNID <> 'All' 
then HDR.SLPRSNID in (''+@SP+'') 
else HDR.SLPRSNID between '0' and 'ZZZZZZZZZZZZZZZ'  
end)

Я пытаюсь запустить вышеуказанный запрос в анализаторе запросов sql, но получаю «синтаксические» ошибки в выражении CASE (около IN, ELSE). Что может быть не так?

Все, что я хочу сделать, это когда sales-personID выбран как ВСЕ в параметре отчета. Я хотел бы обработать всех продавцов, иначе только выбранный идентификатор продавца.

Просто фон о том, что я делаю,

У меня есть запрос, аналогичный приведенному выше запросу (без условия CASE) в наборе данных для отчета SSRS.

Обратите внимание, что @SP — это параметр отчета.


person Anirudh    schedule 30.01.2014    source источник


Ответы (2)


CASE — это выражение, которое возвращает одно значение. Его нельзя использовать для логики управления потоком, как в других языках, таких как VB. Пытаться:

WHERE HDR.SOPTYPE = 2 AND 
((HDR.SLPRSNID <> 'All' AND HDR.SLPRSNID = @SP)
OR
(HDR.SLPRSNID = 'All'))

Хотя кажется, что вам нужно вместо этого, что было бы более логично, если пользователь потенциально передает 'All' в параметр:

WHERE HDR.SOPTYPE = 2 AND 
((@SP <> 'All' AND HDR.SLPRSNID = @SP)
OR
(@SP = 'All'))
person Aaron Bertrand    schedule 30.01.2014
comment
SP — это параметр, который может содержать любое значение, но меняется в зависимости от выбора пользователем 001, 009, 010 и т. д. Как справиться с этим условием? Вы упомянули динамический sql, но я не смог заставить его работать. Мне нужно сделать это в анализаторе запросов. - person Anirudh; 31.01.2014

вы можете просто использовать предложение OR

WHERE HDR.SOPTYPE = 2 AND 
((HDR.SLPRSNID <> 'All' AND HDR.SLPRSNID IN (''+@SP+'')) 
OR 
(HDR.SLPRSNID = 'All' AND HDR.SLPRSNID BETWEEN '0' and 'ZZZZZZZZZZ'))

Не уверен, что BETWEEN '0' and 'ZZZZZZZZZZZ' означает "ВО ВСЕХ". Если да, вы можете просто удалить его сейчас.

Если вы абсолютно хотите использовать CASE WHEN, вы можете сделать это следующим образом:

WHERE HDR.SOPTYPE =2 
AND (CASE WHEN HDR.SLPRSNID <>'All' AND HRD.SLPRSNDID IN (''+@SP+'')) THEN 1
          WHEN HDR.SLPRSNID = 'All' AND HDR.SLPRSNID BETWEEN '0' and 'ZZZZZZZZZZ' THEN 1
          ELSE 0 
     END) = 1
person Raphaël Althaus    schedule 30.01.2014