为什么在Where子句中使用Case

时间:2013-11-12 00:50:50

标签: sql-server case where

我知道这个问题有各种变化,但找不到能解答我想要的问题。

我继承了一个数据库并报告了另一位不再参与其中的程序员。

其中一个查询使用此代码:

Select
     b.HospitalMasterID
    ,b.TxnSite
    ,b.PatientID
    ,b.TxnDate as KeptDate
From
    Billing as b
    Inner Join Patient as p
        on b.HospitalMasterID = p.HospitalMasterID
        and b.PatientID = p.PatientID
Where
    b._IsServOrItem=1
    and b.TxnDate >= '20131001'
    and (Case
            When b.ExtendedAmount > 0 Then 1
            When (Not(p.PlanCode is null)) and (b.listAmount >0) then 1
        End = 1)

当我运行查询时,我得到了返回900x行的apx。如果我删除Case语句,我会返回超过一百万行。

有人可以解释为什么会这样吗?案件陈述到底是做什么的?有没有更好的方法来完成同样的事情。我真的不喜欢这个陈述,因为缺乏结构,整个报表查询很难阅读。

Sql的版本是T-Sql 2012。

谢谢,

2 个答案:

答案 0 :(得分:5)

对我而言似乎正在这样做:

(b.ExtendedAmount > 0 OR (Not(p.PlanCode is null) and (b.listAmount >0)))

也许它是从其他地方复制/粘贴并修改过的?无论如何,这很奇怪。

答案 1 :(得分:1)

我认为有人试图避免使用OR运算符来促进索引搜索扫描。值得一看这个计划,但如果它与格雷格的答案中的逻辑有很大不同,我会感到惊讶。