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是一个报表参数。
答案 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