Sql server Case语句错误:在预期条件的上下文中指定的非布尔类型的表达式

Sql server Case语句错误:在预期条件的上下文中指定的非布尔类型的表达式,sql-server,case,Sql Server,Case,我很难弄清楚这段代码有什么问题。在我在Where子句中添加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:0

我很难弄清楚这段代码有什么问题。在我在Where子句中添加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
案例
当(GETDATE()<'2013-06-30 00:00:00.000'和GETDATE()>='2013-04-01 00:00:00.000')时
当(TargetStartDt>='2013-04-01 00:00:00.000'和TargetStartDt<'2013-06-30 00:00:00.000')时的情况(作业状态='Approved'或作业状态='Closed(Filled'))
结束
当(GETDATE()<'2013-09-30 00:00:00.000'和GETDATE()>='2013-07-01 00:00:00.000')时
当TargetStartDt<'2013-06-30 00:00:00.000'然后(作业状态='Approved'或作业状态='Closed(Filled)'或作业状态='Closed(Not Filled)'时的情况
当(TargetStartDt>='2013-07-01 00:00:00.000'和TargetStartDt<'2013-09-30 00:00:00.000')之后(作业状态='Approved'或作业状态='Closed(Filled)'
结束
当GETDATE()<'2013-12-31 00:00:00.000'和GETDATE()>='2013-10-01 00:00:00.000'时
当TargetStartDt<'2013-09-30 00:00:00.000'然后(作业状态='Approved'或作业状态='Closed(Filled)'或作业状态='Closed(Not Filled)'时的情况
当(TargetStartDt>='2013-10-01 00:00:00.000'和TargetStartDt<'2013-12-31 00:00:00.000')之后(作业状态='Approved'或作业状态='Closed(Filled'))
结束
--其他(作业状态=‘已批准’或作业状态=‘已关闭(已填写)’或作业状态=‘已关闭(未填写)’)
结束

非常感谢你

这看起来像是您的问题:

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

这种类型的子句出现在几个地方。我不确定你想做什么,但是布尔表达式不应该跟在
后面,那么

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 ...

对于格式我很抱歉,由于某种原因我无法更改它…谢谢!我想说的是,如果当前日期超过了某一组日期,那么数据应该生成该目标开始日期的已批准、已关闭(已填写)和已关闭(未填写)的作业状态。如果当前日期在特定的目标开始日期内,则我只想显示已批准或已关闭(已填写)的作业状态。那么有没有办法做到这一点呢?顺便说一句,这是一份招聘申请,用来跟踪求职申请对不起,我没有看到你回复的第二部分。我需要JobStatus作为最终结果,因为它在Where子句中,最终,我只想显示具有这些作业状态的特定日期的作业的信息。我想我可以将其分为3种情况,每种情况以不同的JobStatus=?是的,你是对的。这是您应该做的事情:当(GETDATE()<'2013-06-30 00:00:00.000'和GETDATE()>='2013-04-01 00:00:00.000')发生情况时,然后当(TargetStartDt>='2013-04-01 00:00.000'和TargetStartDt<'2013-06-30 00:00:00.000')发生情况时,然后“批准”其他“关闭(填写)”结束)