2016-06-30 11 views
0

Ich versuche, eine Groß-/Kleinschreibung Klausel in einer WHERE-Anweisung zu verwenden, um Werte zurückzugeben, wenn sie in 2 verschiedene Kategorien fallen.Bedingte 'Fall wenn' innerhalb 'Where' Klausel T-SQL

Dies ist mein Code so weit:

create view dbo.eightmonthinc 
as 
select * 
from dbo.rentincreaseview 
where 
    case when [days same form] <= 9 
    then datediff(month, leasedate ,'2016-08-01 00:00:00') >= 8 
    else datediff(month, rentlastchanged ,'2016-08-01 00:00:00') >= 12) 
    end 
go 

Hier ist eine verbale Pause nach unten von dem, was ich zu tun versuchen.

Wenn meine Tage dieselbe Formel einen Wert < = 9 zurückgibt, möchte ich nur Werte zurückgeben, bei denen die Differenz zwischen dem Leasingdatum und einem festgelegten zukünftigen Datum> = 8 ist.

Wenn meine Tage dieselbe Formel> 9 ist, dann möchte ich nur Werte zurückgeben, bei denen die Differenz zwischen dem letzten Änderungsdatum der Miete und einem zukünftigen Datum> = 12 ist.

Ich möchte jedoch, beide Datensätze in derselben Abfrage zurückgegeben werden. Leider bekomme ich immer einen 'inkorrekten Syntax' Fehler.

Ich lerne immer noch, also bin ich ein wenig unsicher, wie das zu beheben ist. Jede Hilfe würde sehr geschätzt werden.

+0

Ich habe einen logischen Fehler in meiner Antwort behoben - bitte überprüfen Sie es - die alte Version wird falsche Ergebnisse produzieren. Kredit an Gordon Linoff, dessen Antwort auf den Fehler hinwies. – Blorgbeard

Antwort

1

Sie können keine case Aussage wie, dass (Bewertung verschiedene Booleschen Ausdrücken basierend auf einer Eingabe) verwenden, aber Sie können Ihre Logik mit boolean umschreiben AND und OR statt:

where 
    ([days same form] <= 9 and 
    datediff(month, leasedate ,'2016-08-01 00:00:00') >= 8) 
    or 
    ([days same form] > 9 and 
    datediff(month, rentlastchanged ,'2016-08-01 00:00:00') >= 12)) 
1

Sie können tun, was Sie wollen als case Aussage, aber es muss ein Argument datediff() sein:

create view dbo.eightmonthinc as 
select * 
from dbo.rentincreaseview 
where ([days same form] <= 9 and datediff(month, leasedate, '2016-08-01') >= 8 
    ) or 
     ([days same form] > 9 and datediff(month, rentlastchanged, '2016-08-01') >= 12 
    ); 

die richtige Logik den Vergleich aufzu wiederholen brauchtzweimal. Außerdem benötigen Sie nicht die hh: mm: ss auf der Datumskonstante.

0

Ich glaube, das ist, was Sie vorhatten, obwohl Sie wahrscheinlich mit der akzeptierten Antwort bleiben werden, da das die vertrautere Form ist. Offensichtlich ist der Trick unten, case Ausdrücke zu verschachteln. Denken Sie daran, dass case zu einem Wert ausgewertet wird, nicht zu einem bedingten, wie viele Leute versucht haben.

select * 
from dbo.rentincreaseview 
where 
    case when [days same form] <= 9 then 
     case 
      when datediff(month, leasedate ,'2016-08-01') >= 8 then 1 
      when datediff(month, rentlastchanged ,'2016-08-01') >= 12) then 1 
     end 
    end 
go 

Und wie wurde auch von Gordon deuten Sie könnten versuchen:

... 
where 
    datediff(
     month, 
     case when [days same form] then leasedate else rentlastchanged end, 
     '2016-08-01 00:00:00' 
    ) 
     >= 
    case when [days same form] <= 9 then 8 else 12 end 

Es gibt einige Fälle, in denen diese Formen als nützlich erweisen könnten. Die meiste Zeit bezweifle ich, dass es eine gute Idee ist.