1

我试图在 WHERE 子句中搜索 CaseStatement。但我没有发现与我的情况相似的情况。

下面是我在 WHERE 子句中带有 CASE 语句的 SQL 语句。如果PartName = B,那么我应该应用(RecoveraleFlag = 1)条件以及其他条件。Else 此条件不适用,但所有其他条件应保留。

FROM Rec.Communications A
          INNER JOIN REC.CommunicationTypes B ON A.CommunicationTypeKey = B.CommunicationTypeKey   
          INNER JOIN occ.Cases c ON a.CaseId = c.CaseId
          INNER JOIN occ.Claims cl on a.CaseId = cl.CaseId
          INNER JOIN ops.Concepts d ON c.ConceptKey = d.ConceptKey
          INNER JOIN OPS.Regions f ON d.MODSRegionKey = f.MODSRegionKey 
          INNER JOIN COM.RepriceRequestOccurrences e ON a.CommunicationId = e.CommunicationId
          INNER JOIN occ.Providers prv ON c.MODSProviderKey = prv.MODSProviderKey
  WHERE 
**(
    CASE WHEN f.PartName = 'B' and e.RecoverableFlag = 1 then 1
    ELSE 0
  END
  ) = 1**
  AND 
  b.CommunicationTypeCode = 'RREQ'
      AND f.Region = @Region
      AND a.CurrentFlag = 1

如果 Partname = B,则 where 子句中的 Case 语句可以正常工作。对于 Partname A,这将是 0=1 -始终为 false。因此,它不返回任何数据。任何人都可以提供任何替代方案。

4

3 回答 3

5

作为一个案例陈述,你可以这样写:

CASE WHEN f.PartName = 'B' and e.RecoverableFlag = 1 then 1
     WHEN f.ParName = 'A' then 1
     ELSE 0   END   ) = 1

这是你想要的逻辑吗?

许多人会认为 case 语句在这里无关紧要,而是使用:

WHERE ((f.PartName = 'B' and e.RecoverableFlag = 1) or (f.partName <> 'B')) . . .
于 2012-08-20T18:22:15.937 回答
4
WHERE 
    (
        f.PartName <> 'B' 
        OR e.RecoverableFlag = 1
    )
    AND b.CommunicationTypeCode = 'RREQ'
    AND f.Region = @Region
    AND a.CurrentFlag = 1

您可能会发现阅读德摩根定律很有趣。

于 2012-08-20T18:22:05.623 回答
0

我认为您根本不需要案例陈述。以下应该可以工作...

   WHERE  f.PartName = 'B' 
     And e.RecoverableFlag = 1 
     AND b.CommunicationTypeCode = 'RREQ'       
     AND f.Region = @Region       
     AND a.CurrentFlag = 1 

但是,如果您想在 where 子句中使用 case 语句,请尝试将其放在列名中比较运算符的“另一端”,以便查询可以在不进行表扫描的情况下对其进行处理......例如,

   Where f.Partname = 
       Case b.CommunicationTypeCode 
          When 'RREQ' Then 'B' 
          When 'NOTREQ' Then 'C'
          When 'OPT' Then 'D' 
          Else 'F' End
于 2012-08-20T18:29:25.740 回答