将案例放置在Where子句中

时间:2018-08-02 12:37:49

标签: sql tsql ssms ssms-2016

在我的过程中,我有一个where语句来显示datecomplete在所选参数内的所有记录,或者如果未设置参数,则仅显示所有记录,无论它们在datecomplete列中是否有任何数据。

我试图通过以下代码实现这一目标:

WHERE (jobsToCheck.DateCompleted =
CASE WHEN @StartDateCompleted IS NULL THEN jobsToCheck.DateCompleted IS NULL
ELSE (jobsToCheck.DateCompleted BETWEEN @StartDateCompleted AND 
@EndDateCompleted OR @StartDateCompleted IS NULL) END)

但是在关键字“ IS”附近出现错误“语法不正确”。有更好的方法吗?

我最接近预期结果的方法是使用以下方法:

(jobsToCheck.DateCompleted BETWEEN @StartDateCompleted AND @EndDateCompleted 
OR @StartDateCompleted IS NULL) OR jobsToCheck.DateCompleted IS NULL

但是,当我设置数据StartDate和EndDate参数时,这将显示所有带有或不带有日期完成的记录,但是我只希望具有在开始日期和结束日期之间或者没有设置开始日期或结束日期的datecomplete的记录。记录所有没有日期完成的记录。

2 个答案:

答案 0 :(得分:1)

最好避免在case子句中使用where表达式,尤其是当您可以使用常规布尔逻辑执行相同的操作时:

WHERE (jobsToCheck.DateCompleted >= @StartDateCompleted OR @StartDateCompleted IS NULL) AND
      (jobsToCheck.DateCompleted <= @EndDateCompleted OR @EndDateCompleted IS NULL) OR
      jobsToCheck.DateCompleted IS NULL

答案 1 :(得分:0)

第二个“ IS NULL”表达式是错误的。我的意思是您应该将声明更改为:

<GroupBox> <GroupBox.Header> <TextBlock Text="{Binding CurrentTargetUnit, Converter={StaticResource QuantityToTextConverter}, ConverterParameter={x:Static enumerations:Quantity.Length}, StringFormat=Foundation Height ({0})}"> </GroupBox.Header> </GroupBox>