Sql server WHERE子句中的SQL Server Case语句
我试图在WHERE子句中搜索case语句。但我没有发现类似的情况 下面是我的SQL语句和WHERE子句中的CASE语句。如果PartName=B,那么我应该应用(RecoveraleFlag=1)条件以及其他条件。否则,该条件不适用,但所有其他条件应保持不变Sql server WHERE子句中的SQL Server Case语句,sql-server,sql-server-2008,tsql,case,Sql Server,Sql Server 2008,Tsql,Case,我试图在WHERE子句中搜索case语句。但我没有发现类似的情况 下面是我的SQL语句和WHERE子句中的CASE语句。如果PartName=B,那么我应该应用(RecoveraleFlag=1)条件以及其他条件。否则,该条件不适用,但所有其他条件应保持不变 FROM Rec.Communications A INNER JOIN REC.CommunicationTypes B ON A.CommunicationTypeKey = B.CommunicationTypeK
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。因此,它不会返回任何数据。
任何人都可以给出任何替代方案。在哪里
WHERE
(
f.PartName <> 'B'
OR e.RecoverableFlag = 1
)
AND b.CommunicationTypeCode = 'RREQ'
AND f.Region = @Region
AND a.CurrentFlag = 1
(
f、 部件名“B”
或e.RecoverableFlag=1
)
和b.CommunicationTypeCode='RREQ'
和f.Region=@Region
和a.CurrentFlag=1
你可能会发现阅读这本书很有趣。在哪里
(
f、 部件名“B”
或e.RecoverableFlag=1
)
和b.CommunicationTypeCode='RREQ'
和f.Region=@Region
和a.CurrentFlag=1
您可能会发现阅读上的内容很有趣。作为案例陈述,您可以这样写:
CASE WHEN f.PartName = 'B' and e.RecoverableFlag = 1 then 1
WHEN f.ParName = 'A' then 1
ELSE 0 END ) = 1
这就是你想要的逻辑吗
许多人会认为案例陈述与此无关,而是使用:
WHERE ((f.PartName = 'B' and e.RecoverableFlag = 1) or (f.partName <> 'B')) . . .
其中((f.PartName='B'和e.RecoverableFlag=1)或(f.PartName'B'))。
作为案例陈述,您可以这样写:
CASE WHEN f.PartName = 'B' and e.RecoverableFlag = 1 then 1
WHEN f.ParName = 'A' then 1
ELSE 0 END ) = 1
这就是你想要的逻辑吗
许多人会认为案例陈述与此无关,而是使用:
WHERE ((f.PartName = 'B' and e.RecoverableFlag = 1) or (f.partName <> 'B')) . . .
其中((f.PartName='B'和e.RecoverableFlag=1)或(f.PartName'B'))。
我认为您根本不需要案例陈述。。以下几点应该有用
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
我认为你根本不需要案件陈述。。以下几点应该有用
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