Оператор SQL Server Case в предложении WHERE

Я попытался найти в Google CaseStatement в предложении WHERE. Но я не нашел похожего на свой сценарий.

Ниже приведен мой оператор SQL с оператором CASE в предложении WHERE. Если PartName = B, то я должен применить (RecoveraleFlag = 1) условие вместе с другими условиями. Иначе Это условие не должно применяться, но все остальные условия должны оставаться.

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

Здесь оператор Case в предложении where работает нормально, если Partname = B. Для Partname A это будет 0 = 1 - всегда ложно. Из-за этого он не возвращает никаких данных. Может кто какие альтернативы дает.


person Rita    schedule 20.08.2012    source источник


Ответы (3)


В качестве оператора case вы должны написать это как:

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')) . . .
person Gordon Linoff    schedule 20.08.2012

WHERE 
    (
        f.PartName <> 'B' 
        OR e.RecoverableFlag = 1
    )
    AND b.CommunicationTypeCode = 'RREQ'
    AND f.Region = @Region
    AND a.CurrentFlag = 1

Возможно, вам будет интересно прочитать статью на Законах Де Моргана.

person Seth Flowers    schedule 20.08.2012

Я не верю, что вам вообще нужно описание случая ... Следующее должно сработать ...

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

Но если вы хотите использовать оператор case в предложении where, попробуйте поместить его на «другую» сторону оператора сравнения от имени столбца, чтобы запрос мог обработать его, не выполняя сканирование таблицы ... например,

   Where f.Partname = 
       Case b.CommunicationTypeCode 
          When 'RREQ' Then 'B' 
          When 'NOTREQ' Then 'C'
          When 'OPT' Then 'D' 
          Else 'F' End
person Charles Bretana    schedule 20.08.2012