Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 case语句中关键字“in”附近的语法不正确_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 case语句中关键字“in”附近的语法不正确

Sql server 2008 case语句中关键字“in”附近的语法不正确,sql-server-2008,tsql,Sql Server 2008,Tsql,这是一个问题 `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 = da

这是一个问题

`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可能有多个选择,也可能没有多个选择。

我认为,您的最后两行和案例应该是这样的:

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

当@reportparameter='false'时,您似乎希望有条件地将e.employeename与@employee进行检查

我不建议对此操作使用案例陈述。而只是使用一个或一个条件。SQL Server优化器通常会处理WHERE子句中的CASE语句或比CASE语句更快的语句

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%确定你是否正确地使用了这个条件。如果@employee仅包含一名员工,则应使用=而不是IN。我假设@ReportParameter是一个字符串变量,但使用“false”作为值是不寻常的。通常情况下,您会使用一个位并对照1或0检查真与假。

我认为您的第二个dateadd函数已经完成

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

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

您不能使用这样的用例。见Eric,员工可以是多选。我使用这部分过滤器的目标是,如果需要,可以按员工进行过滤,如果需要,可以不按员工进行过滤。Reportparameter是一个布尔类型的参数,这就是它为True或False的原因。但是,最终用户将其视为是或否。Bijith,这部分功能正常。我正在使用employee筛选器添加where子句。我的目标有两个:如果需要,我想按员工筛选,如果需要,我不想按员工筛选。