【问题标题】:Getting error with CASE expression using WHERE clause使用 WHERE 子句的 CASE 表达式出错
【发布时间】:2014-02-23 11:15:10
【问题描述】:
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 是一个报告参数。

【问题讨论】:

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


    【解决方案1】:

    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'))
    

    【讨论】:

    • SP 是一个参数,它可以包含任何一个值,但会随着用户选择 001、009、010 等而变化。我该如何处理这种情况?你提到了动态 sql,但我无法让它工作。我需要在查询分析器中执行此操作。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多