使用WHERE子句获取CASE表达式的错误

时间:2014-01-30 22:16:18

标签: sql-server-2008 reporting-services dataset case query-analyzer

declare @SP nvarchar(3)

SELECT HDR.SOPNUMBE, HDR.docdate, HDR.pymtrmid, 
RTRIM(HDR.ShipToName) +
CASE WHEN HDR.ADDRESS1 <> '' THEN char(10) + RTRIM(HDR.ADDRESS1) ELSE '' END 
FROM vSOPHdr HDR
WHERE HDR.SOPTYPE = 2 AND 
(CASE WHEN HDR.SLPRSNID <> 'All' 
then HDR.SLPRSNID in (''+@SP+'') 
else HDR.SLPRSNID between '0' and 'ZZZZZZZZZZZZZZZ'  
end)

我试图在sql查询分析器中运行上述查询,但在CASE表达式(IN,ELSE附近)中出现'语法'错误。可能有什么不对?

我想要做的就是在报表参数中选择sales-personID作为ALL时我想处理所有销售人员只有选定的销售人员ID。

只是关于我在做什么的背景,

我对SSRS报告的数据集中的上述查询(没有CASE条件)有类似的查询。

请注意,@ SP是一个报表参数。

2 个答案:

答案 0 :(得分:4)

CASE是一个返回单个值的表达式。它不能用于控制流逻辑,就像VB等其他语言一样。尝试:

WHERE HDR.SOPTYPE = 2 AND 
((HDR.SLPRSNID <> 'All' AND HDR.SLPRSNID = @SP)
OR
(HDR.SLPRSNID = 'All'))

虽然看起来似乎可能需要,但如果用户可能将'All'传递给参数,那么这将更具逻辑意义:

WHERE HDR.SOPTYPE = 2 AND 
((@SP <> 'All' AND HDR.SLPRSNID = @SP)
OR
(@SP = 'All'))

答案 1 :(得分:2)

你可以使用OR子句

WHERE HDR.SOPTYPE = 2 AND 
((HDR.SLPRSNID <> 'All' AND HDR.SLPRSNID IN (''+@SP+'')) 
OR 
(HDR.SLPRSNID = 'All' AND HDR.SLPRSNID BETWEEN '0' and 'ZZZZZZZZZZ'))

不确定BETWEEN '0' and 'ZZZZZZZZZZZ'是否意味着“IN everything”。如果是,您现在可以将其删除。

如果你绝对想要使用CASE WHEN,你可以这样做:

WHERE HDR.SOPTYPE =2 
AND (CASE WHEN HDR.SLPRSNID <>'All' AND HRD.SLPRSNDID IN (''+@SP+'')) THEN 1
          WHEN HDR.SLPRSNID = 'All' AND HDR.SLPRSNID BETWEEN '0' and 'ZZZZZZZZZZ' THEN 1
          ELSE 0 
     END) = 1