0
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 是一个报告参数。

4

2 回答 2

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'))
于 2014-01-30T22:19:41.090 回答
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 一切”。如果是,您现在可以删除它。

如果你绝对想使用 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
于 2014-01-30T22:20:55.297 回答