【问题标题】:Why use Case in Where Clause为什么在 Where 子句中使用案例
【发布时间】:2013-11-23 23:56:16
【问题描述】:

我知道这个问题有多种变体,但找不到可以回答我正在寻找的问题。

我从另一个不再参与其中的程序员那里继承了一个数据库和报告。

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

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)

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

有人可以解释为什么会这样吗?案例陈述究竟在做什么?有没有更好的方法来完成同样的事情。我真的不喜欢这种说法,而且由于缺乏结构,整个报告查询很难阅读。

Sql 的版本是 T-Sql 2012。

谢谢,

【问题讨论】:

  • 它可能是早期代码留下的具有更多WHEN 子句的工件,或者有人可能预计稍后会添加更多,这似乎是个好主意。它甚至避免使用p.PlanCode is not NULL。叹息。

标签: sql-server case where


【解决方案1】:

我认为有人试图避免使用 OR 运算符来促进索引搜索而不是扫描。该计划值得一看,但如果它与 Greg 回答中的逻辑有显着差异,我会感到惊讶。

【讨论】:

    【解决方案2】:

    在我看来是这样的:

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

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

    【讨论】:

    • 谢谢-这就是我想的,我想不通的是为什么它会改变查询的结果?我只能认为它是使用 Query Builder 构建的,它会抛出奇怪的编码,而且它也是使用 SSRS 构建的,而不是直接在 SSMS 中构建的。只是希望我知道为什么结果上有 100K 行差异。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多