2013-11-12 3 views
2

Я знаю, что есть варианты этого вопроса, но не могу найти тот, который отвечает на то, что я ищу.Зачем использовать Case in Where Section

Я унаследовал базу данных и отчеты от другого программиста, которого больше нет на картинке.

Один из запросов использует этот код:

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) 

При запуске запроса я получаю APX 900000 возвращаемых строк. Если я удалю оператор Case, я получаю более миллиона возвращенных строк.

Может кто-нибудь объяснить, почему это так? Что конкретно делает заявление о делах? Есть ли лучший способ сделать то же самое. Мне действительно не нравится это утверждение в его нынешнем виде, и весь запрос отчета очень трудно прочитать из-за отсутствия структуры.

Версия Sql является T-Sql 2012

Спасибо,

+0

Это может быть артефакт, оставшийся от более раннего кода, в котором было больше предложений WHEN, или кто-то, возможно, ожидал добавления позже, и это казалось хорошей идеей. Он даже избегает использования 'p.PlanCode не NULL'. Вздох. – HABO

ответ

1

Я думаю, что это кто-то пытается избежать использования оператора OR, чтобы ускорить поиск индексов над сканированием. Стоит взглянуть на план, но я был бы удивлен, если бы он значительно отличался от логики в ответе Грега.

5

Кажется мне, как он делает это:

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

Может быть, это было копировать/вставить где-то еще и модифицировать? Несмотря на это, это странно.

+0

Спасибо, это то, что я понял, что я не могу понять, почему он меняет результаты запроса? Я могу только думать, что он был построен с помощью Query Builder, который вызывает странное кодирование, и он также был построен с использованием SSRS, а не непосредственно в SSMS. Просто хочу, чтобы я знал, почему разница в размере 100K по результатам. – SASUSMC