【问题标题】:Putting a Case When Statement inside Where Clause在 Where 子句中放置一个 case when 语句
【发布时间】:2019-01-10 05:45:30
【问题描述】:

在我的过程中,我有一个 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 参数时,这会显示所有包含或不包含完整日期的记录,但我只想要在开始日期和结束日期之间或者我没有设置开始日期或结束日期的记录为所有没有完成日期的记录添加日期。

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 虽然this answer 适用于join 条件,但它与where 的工作方式相同。

标签: sql tsql ssms ssms-2016


【解决方案1】:

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

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

【讨论】:

  • 这并不完全有效,当设置参数时,我得到了我期望的结果,但是当参数为 null 时,我没有返回任何记录,但我想查看 DateCompleted 为 NULL 的所有记录
【解决方案2】:

您的第二个“IS NULL”表达式是错误的。我的意思是你应该把你的陈述改成这样:

WHERE (jobsToCheck.DateCompleted = CASE WHEN @StartDateCompleted IS NULL THEN ISNULL(jobsToCheck.DateCompleted, 'value that whatever you want') ELSE (jobsToCheck.DateCompleted BETWEEN @StartDateCompleted AND @EndDateCompleted OR @StartDateCompleted IS NULL) END)

【讨论】:

  • 然后我在关键字“BETWEEN”附近收到错误语法错误
  • 你可以这样改变:(SELECT jobsToCheck.DateCompleted FROM "TableName" WHERE jobsToCheck.DateCompleted BETWEEN @StartDateCompleted AND @EndDateCompleted OR @StartDateCompleted IS NULL)carel 带括号
  • 你的 WHERE 条件应该有什么样的值?复数还是单值?
猜你喜欢
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2017-04-10
相关资源
最近更新 更多