我试图找到在存储过程中使用动态where子句的最佳方法。
我有几个参数是从另一个进程传入存储过程的,我需要使用的参数是@param,它可以是'm'或'd'
我正在尝试使用@param来区分它是'm'还是'd',并基于我希望能够添加过滤器的值。简化查询如下:
Select Val1, Val2, Val3, Val4 from a tbl1
where 1=1 and SomeField in ('APPLE','HP')
--Now I'm thinking - One way of doing this - I'm not sure if I need all this...
AND 1 = (CASE WHEN (@Param='M' and Val1 <= @ParamDate) THEN 1
WHEN (@Param='D' and Val1 <= DATEADD(mm,DATEDIFF(mm,-1,@ParamDate),-1)) THEN 1
ELSE 0
END)
--Another way I'm thinking is
AND ((Val1 <= @ParamDate and @Param = 'M') or NOT @Param='M')
AND ((Val1 <= DATEADD(mm,DATEDIFF(mm,-1,@ParamDate),-1) and @Param='D') or NOT @Param='D')
AND --Other parts of the where clause
我想找到最好的方法。他们中的任何一个更有意义,或者也许有一种不同的方式来实现这一点。我希望以最实际的方式来做这件事,并让它可读,因为这是一个非常长的查询。
1条答案
按热度按时间thigvfpy1#
我建议使用布尔逻辑而不是
case
表情。这使得意图更加清晰。如果我没听错的话,逻辑应该是:括号的内圆括号
and
实际上并不需要条件,但是使用它们可以更容易地理解条件是多么复杂。