sql—存储过程中的动态where子句

ej83mcc0  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(411)

我试图找到在存储过程中使用动态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

我想找到最好的方法。他们中的任何一个更有意义,或者也许有一种不同的方式来实现这一点。我希望以最实际的方式来做这件事,并让它可读,因为这是一个非常长的查询。

thigvfpy

thigvfpy1#

我建议使用布尔逻辑而不是 case 表情。这使得意图更加清晰。如果我没听错的话,逻辑应该是:

select val1, val2, val3, val4 
from a tbl1 
where 
    somefield in ('apple','hp')
    and (
        (@param='m' and val1 <= @paramdate) 
        or (@param='d' and val1 <= dateadd(mm,datediff(mm,-1,@paramdate),-1))
    )

括号的内圆括号 and 实际上并不需要条件,但是使用它们可以更容易地理解条件是多么复杂。

相关问题