Using CASE in WHERE Statement when parameter has multiple values

China☆狼群 提交于 2019-12-31 04:00:09

问题


I have a problem which I think relates to having a multiple value parameter.

In my TblActivity there are two fields TblActivity.ActivityServActId and TblActivity.ActivityContractId which I want to include in my WHERE statement.

Filtering by these is optional. If the user selects 'Yes' for the parameter @YESNOActivity, then I want to filter the query looking for rows where TblActivity.ActivityServActId matches one of the options in the parameter @ServiceActivity.

The same goes for the @YESNOContract, TblActivity.ActivityContractId and @Contract respectively

I managed to get to this:

WHERE
(CASE WHEN @YESNOActivity = 'Yes' THEN TblActivity.ActivityServActId ELSE 0 END) 
IN (CASE WHEN @YESNOActivity = 'Yes' THEN @ServiceActivity ELSE 0 END)  

AND (CASE WHEN @YESNOContract = 'Yes' THEN TblActivity.ActivityContractId ELSE 0 END) 
IN (CASE WHEN @YESNOContract = 'Yes' THEN @Contract ELSE 0 END)

However, although this code works fine if there is only one value selected in the parameter @ServiceActivity or @Contract, as soon as I have more than one value in these parameters, I get the error:

Incorrect syntax near ','.
Query execution failed for dataset 'Activity'. (rsErrorExecutingCommand)
An error has occurred during report processing. (rsProcessingAborted)

Can anyone see what I'm doing wrong? I could understand it if I had an = instead of IN in the WHERE statement but can't figure this one out.

Using SQL Server 2008 and SSRS 2008-r2


回答1:


If your @ServiceActivity is something like 1,2,3

You can do something like this

WHERE  `,1,2,3,` LIKE `%,1,%` 

So you format your variables

WHERE  ',' + @ServiceActivity + ',' LIKE '%,' + ID + ',%'

SQL FIDDLE DEMO

SELECT *
FROM 
    (SELECT '1,2,3,4' as X UNION ALL
     SELECT '2,3,4,5' as X UNION ALL
     SELECT '3,4,5,6' as X UNION ALL
     SELECT '1,3,4,5' as X 
     ) as T
WHERE ',' + X + ','  LIKE  '%,1,%'

For Your Case

(CASE WHEN @YESNOActivity = 'Yes' 
           THEN ',' + @ServiceActivity + ','
           ELSE NULL 
 END)
LIKE
(CASE WHEN @YESNOActivity = 'Yes' 
           THEN '%,' + TblActivity.ActivityServActId + ',%'
           ELSE 0 
 END) 



回答2:


In SQL, the IN clause does not support parameters the way you are using them. The general syntax is

IN (1, 2, 3, 4)

you have

IN (@Param)

where something like @Param = '1, 2, 3, 4'

Internally, SQL will turn this into

IN ('1, 2, 3, 4')

Note the quotes... you are now matching against a string!

There are a number of ways to address this. Search SO for "sql in clause parameter", pick one that works for you, and upvote it.


(Added)

Parameterize an SQL IN clause seems pretty definitive on the subject. While long ago I upvoted the third reply (the one with table-value parameters), any of the high-vote answers could do the trick. The ideal answer depends on the overall problem you are working with. (I am not familiar with SSRS, and can't give more specific advice.)




回答3:


So after a lot of messing around I put together a simple workaround for this by dropping my use of CASE altogether - but I have a suspicion that this is not a terribly efficient way of doing things.

WHERE
(@YESNOActivity = 'No' OR (@YESNOActivity = 'Yes' AND
TblActivity.ActivityServActId IN (@ServiceActivity)))

AND

(@YESNOContract = 'No' OR (@YESNOContract = 'Yes' AND
TblActivity.ActivityContractId IN (@Contract)))


来源:https://stackoverflow.com/questions/34814908/using-case-in-where-statement-when-parameter-has-multiple-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!