【问题标题】:Case Statement Error: an expression of non-boolean type specified in a context where condition is expected案例语句错误:在预期条件的上下文中指定的非布尔类型的表达式
【发布时间】:2013-07-29 14:57:15
【问题描述】:

我无法弄清楚这段代码有什么问题。在 Where 子句中添加 Case 语句之前,查询工作正常,但是当我添加它时,我得到了那个错误。如果有人可以帮助我,我将不胜感激!

这里是case语句

CASE 
    WHEN (GETDATE()< '2013-06-30 00:00:00.000' AND GETDATE() >= '2013-04-01 00:00:00.000') THEN 
        CASE WHEN (TargetStartDt >= '2013-04-01 00:00:00.000' AND TargetStartDt < '2013-06-30 00:00:00.000') THEN (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)')
        END 
    WHEN (GETDATE() < '2013-09-30 00:00:00.000' AND GETDATE() >= '2013-07-01 00:00:00.000') THEN 
        CASE WHEN TargetStartDt < '2013-06-30 00:00:00.000' THEN (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)' OR JobStatus = 'Closed(Not Filled)')
             WHEN (TargetStartDt >= '2013-07-01 00:00:00.000' AND TargetStartDt < '2013-09-30 00:00:00.000') THEN (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)')
        END  
    WHEN GETDATE() < '2013-12-31 00:00:00.000' AND GETDATE()>= '2013-10-01 00:00:00.000' THEN
        CASE WHEN TargetStartDt < '2013-09-30 00:00:00.000' THEN (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)' OR JobStatus = 'Closed(Not Filled)')
             WHEN (TargetStartDt >= '2013-10-01 00:00:00.000' AND TargetStartDt < '2013-12-31 00:00:00.000')  THEN (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)')
        END 
    --ELSE (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)' OR JobStatus = 'Closed(Not Filled)')
END

非常感谢!!

【问题讨论】:

  • 很抱歉格式,由于某种原因我无法更改它..

标签: sql-server case


【解决方案1】:

CASE 是一个返回单个值的表达式。它不能用于布尔或流控制逻辑。因此你不能说:

THEN (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)'
   OR JobStatus = 'Closed(Not Filled)')

您需要以不同的方式构建此子句。我不会尝试对您的整个查询进行逆向工程,但也许不是嵌套的 CASE 它应该是一个单一的:

CASE WHEN (date range checks) AND 
  (JobStatus IN ('Approved', 'Closed(Filled)', 'Closed(Not Filled)')) 
THEN ...

【讨论】:

  • 谢谢!我想说的是,如果当前日期超过了某个日期集,则数据应该为该目标开始日期生成已批准、已关闭(已填充)和已关闭(未填充)的 JobStatuse。如果当前日期在特定的目标开始日期之内,那么我只想显示已批准或已关闭(已完成)的作业状态。那么有没有办法做到这一点?顺便说一句,这是用于招聘申请,以跟踪工作申请
  • 抱歉没有看到您回复的第二部分。我需要 JobStatus 作为最终结果,因为它在 Where 子句中,最终,我只想显示具有这些工作状态的特定日期的工作信息
  • 我想我可以把它分成 3 个案例,每个案例都以不同的 JobStatus = ........ 结尾?
  • 是的,你是对的。这是你应该做的事情: CASE WHEN (GETDATE()= '2013-04-01 00:00:00.000') THEN CASE WHEN ( TargetStartDt >= '2013-04-01 00:00:00.000' AND TargetStartDt
【解决方案2】:

这看起来像你的问题:

THEN (JobStatus = 'Approved' OR JobStatus = 'Closed(Filled)' OR JobStatus = 'Closed(Not Filled)')

这种类型的子句出现在几个地方。我不确定您要做什么,但布尔表达式不应该遵循THEN

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多