有多个条件的SQL Where IF语句

0 人关注

/* 我在SQL Server Report Builder中工作,我有一个Where语句,其中一个参数等于一个值,检查另一个参数,然后做一些事情,否则做其他事情。 下面是一个例子。

where
case when @Parameter1 = 'Value' then
when @Parameter2 = True then
Date >= @BegDate and
Date <= @EndDate and
       totext(Field) = @Parameter1 and
      Field2 = 'Value2'
       totext(Field) = @Parameter1 and
        Field2 = 'Value2'
Case when @Parameter1 = 'Value3' then
        Field3 = ToNumber(@Parameter3) and
        Field2 = 'Value2';
1 个评论
Stu
CASE是一个 表达式 ,它返回一个单一的标量值,它不是一个流程控制 语句 ,你需要用适当的括号来写你的逻辑和/或标准。
sql
sql-server
where-clause
Tony
Tony
发布于 2022-02-18
2 个回答
Charlieface
Charlieface
发布于 2022-02-18
0 人赞同

你在这里不需要 CASE ,它返回一个标量值。只需使用普通的布尔逻辑

WHERE (
             @Parameter1 = 'Value'
AND @Parameter2 = 'True'
AND Date >= @BegDate
AND Date <= @EndDate
AND totext(Field) = @Parameter1
AND Field2 = 'Value2'
        ( @Parameter1 = 'Value'
AND totext(Field) = @Parameter1
AND Field2 = 'Value2'
        ( @Parameter1 = 'Value3'
AND FIeld3 = ToNumber(@Parameter3)
         AND Field2 = 'Value2'

显然,你可以通过将一些条件拉到OR的外部来简化这个过程

MarcinJ
MarcinJ
发布于 2022-02-18
0 人赞同

你需要重写你的案例,使它 "返回 "一些东西,然后你再检查。我不确定你的逻辑到底是什么,因为你的 CASE 嵌套得不正确,所以很难读懂,但这应该能给你一个概念

WHERE CASE -- first set of conditions
WHEN @Parameter1 = 'Value'
AND @Parameter2 = True
AND Date >= @BegDate
AND Date <= @EndDate
AND totext(Field) = @Parameter1
AND Field2 = 'Value2'
THEN 1 -- return 1 when the first condition is met
-- Second set of conditions      
WHEN @Parameter1 = 'Value' -- but not @Parameter2 = True, that'd have been matched above
AND totext(Field) = @Parameter1
AND Field2 = 'Value2'
THEN 1`
        -- Third set of conditions
WHEN @Parameter1 = 'Value3'
AND FIeld3 = ToNumber(@Parameter3)
         AND Field2 = 'Value2'