2016-04-01 10 views
0

Diğer duruma bağlı olarak sol dış birleşimin "açık" bölümüne bir koşul eklemek istiyorum. "Case when" i kullanmaya çalışıyorum ama SQL Server 2008 bir sözdizimi hatası veriyor (eşitlik işaretlerinden memnun değil). Bunun için çok kolay olabilir, ama bunu nasıl düzelteceğimi gerçekten anlayamadım. Herhangi bir yardım takdir edilecektir.Diğer koşullara bağlı olarak sol dış birleştirmeye koşul ekleme - SQL Server 2008

@declare @timeMode int = 2; 
... 
... 
select * 
from #AllPeriods ap 
left outer join #results r on ap.p1= r.p1 
          and ap.p2 = r.p2 
          and DATEDIFF(S,ap.StartPeriod, r.StartPeriod) = 0 
          and 
          case 
           when @timeMode != 4 
            then DATEDIFF(s,ap.EndPeriod, r.EndPeriod) = -1 
            else DATEDIFF(s,ap.EndPeriod, r.EndPeriod) = 0 
          end 
+1

CASE bir ifadedir. Bir skaler değer döndürmek için kullanılır. Burada kodunuzda çalıştığınız şekilde kullanılamaz. –

cevap

0

Bir case kullanabilirsiniz, ancak SQL Server uygulanabilir bir seçenek olarak bir boolean ifadeyi tanımıyor.

from #AllPeriods ap left outer join 
    #results r 
    on ap.p1 = r.p1 and 
     ap.p2 = r.p2 and 
     DATEDIFF(second, ap.StartPeriod, r.StartPeriod) = 0 and 
     DATEDIFF(second, ap.EndPeriod, r.EndPeriod) = (case when @timeMode <> 4 then -1 else 0 end) 

Ancak case gerekli değildir: Yani, burada case kullanmak üzere bir yoldur. Sadece OR kullanabilirsiniz:

from #AllPeriods ap left outer join 
    #results r 
    on ap.p1 = r.p1 and 
     ap.p2 = r.p2 and 
     DATEDIFF(second, ap.StartPeriod, r.StartPeriod) = 0 and 
     ((@timeMode <> 4 and DATEDIFF(second, ap.EndPeriod, r.EndPeriod) = -1) or 
     (@timeMode = 4 and DATEDIFF(second, ap.EndPeriod, r.EndPeriod) = 0) 
     ) 

Not: Bu oldukça doğru olmadığını @timeMode could be NULL` olduğunu.