【问题标题】:incorrect syntax near the keyword 'in' in case statementcase语句中关键字'in'附近的语法不正确
【发布时间】:2015-12-11 01:24:14
【问题描述】:

这里是查询

`select 
p.occid,
p.occdate,
f.fillername,
badgeID= null,
p.mc
p.mctime,
problemcode = isnull(p.problemcode,400),
pc.problemdesc,
p.timerresolved,
p.duration,
e.employeename,
pl.durationinminutes,
pl.timein,
pl.timeout,
problemdescription = datediff(minute,occdate,timeresolved)

from problem as p
left join filler as f
on p.fillerid = f.fillerid
left join problemlog as pl
on p.occid = pl.occid
left join problemcode as pc
on p.problemcode = pc.problemcode
left join employee as e 
on pl.badgeid = e.id

where f.intials = @fillerselect and
occdate between dateadd(day, datediff(day, '19000101', @startdate), 
cast(@starttime as datetime2(7))) and 
dateadd(day, datediff(day, '19000101', cast @endtime as datetime2(7))) 
and p.problemcode in (@problemcode) 
and @Duration <= datediff(minute, occdate, timeresolved) 
and case when @reportparameter like 'false' 
         then e.employeename in  (@employee)`

我的问题在于 case 子句。我收到一条错误消息,指出“关键字 'in' 附近的语法不正确。有人知道如何克服这个问题吗?

我应该提到@employee 可以有多个选择。当@reportparameter 为“False”时,@employee 为“None”,说明我们没有按员工过滤。当@reportparameter 为“true”时,我们按员工过滤,@employee 可能有也可能没有多项选择。

【问题讨论】:

标签: sql-server-2008 tsql


【解决方案1】:

我认为,您的最后两行(以及当时的情况)应该是这样的:

and ( @reportparameter like 'false' and e.employeename in (@employee) ) 

【讨论】:

    【解决方案2】:

    当@reportparameter = 'false' 时,您似乎想根据@employee 有条件地检查e.employeename

    我不建议对此操作使用 case 语句。而是只使用 OR 条件。 SQL Server 优化器将比 WHERE 子句中的 CASE 语句更快地处理 OR(通常)。

    WHERE f.intials = @fillerselect
      AND occdate BETWEEN dateadd(DAY, datediff(DAY, '19000101', @startdate), cast(@starttime AS datetime2(7))) AND dateadd(DAY, datediff(DAY, '19000101', CAST @endtime AS datetime2(7)))
      AND p.problemcode IN (@problemcode)
      AND @Duration <= datediff(MINUTE, occdate, timeresolved)
      AND ((@reportparameter = 'false'
            AND e.employeename IN (@employee))
           OR (@reportparameter <> 'false'
               AND e.employeename IN (@somethingelse)))
    

    您可能还想在 WHERE 子句中更改其他内容。我不是 100% 确定您是否正确使用了 IN 条件。如果@employee 仅包含一名员工,则应使用 = 而不是 IN。我假设@ReportParameter 是一个字符串变量,但使用“false”作为值是不寻常的。通常你会使用 BIT 并检查 1 或 0 来判断 True 与 False。

    【讨论】:

    • Eric,员工可以多选。我对这部分过滤器的目标是能够在需要时按员工过滤,或者在需要时不按员工过滤。 Reportparameter 是一个布尔类型参数,这就是它是 True 或 False 的原因。但是,最终用户将其视为是或否。
    【解决方案3】:

    我认为您的第二个 dateadd 功能已完成

    dateadd(day, datediff(day, '19000101', cast @endtime as datetime2(7)))
    

    这里我只能看到 2 个参数,我认为缺少第 3 个参数,添加第 3 个参数可能会解决问题

    【讨论】:

    • Bijith,这部分功能正常。我正在使用员工过滤器添加 where 子句。我的目标有两个:如果需要,我想按员工过滤,如果需要,我不按员工过滤。
    猜你喜欢
    • 2013-08-02
    • 2013-10-29
    • 1970-01-01
    • 2014-07-15
    • 2014-08-03
    • 2016-06-08
    • 1970-01-01
    • 2013-12-16
    • 2018-10-21
    相关资源
    最近更新 更多