2016-06-20 8 views
0

Ich habe einige andere Q & A über Case-Anweisungen innerhalb der WHERE-Klausel gelesen, aber ich kann nicht wirklich verstehen, wie man es verwendet. Ich werde unten einen Ausschnitt des Codes posten. Ich glaube, ich weiß nichts über ein grundlegendes Prinzip, wie man eine Case-Anweisung verwendet, und deshalb wird der Code nicht kompiliert/ausgeführt. Ich schätze jede Hilfe.SQL Case-Anweisung: Inside Where-Klausel

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case 
    When n.OnOrder IN ('0', '') 
    Then i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime))) 
    End) 

Sortieren nach i.LastShpd ab

Um zu erklären, was ich oben, ich habe bereits die entsprechende ‚SELECT‘ und ‚FROM‘ Aussage. Jetzt filtere ich die Ergebnisse basierend auf den angezeigten Variablen (ecx LastShpd). Ich wollte, dass die case-Anweisung Folgendes tut: Wenn n.OnOrder = 0 ist, möchte ich nur die Zeilen behalten, in denen i.OnOrder = 0 ist oder wenn i.LastShpd länger als 21 Tage war.

+1

Sie müssen eine Logik nach dem Ende hinzufügen und (Case Wenn n.OnOrder IN ('0', '') Dann i.OnOrder = 0 oder i.LastShpd damola

Antwort

3

Ich glaube nicht, dass Sie einen Fall für diese benötigen:

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
    (n.OnOrder IN ('0', '') and i.OnOrder = 0) 
or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime) 
    ) 

Re-Lektüre vielleicht Ihre Frage dieser andere Weg ist:

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (
    n.OnOrder Not IN ('0', '') 
    or i.OnOrder = 0 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime) 
    ) 
+1

Das ist eine viel bessere Lösung. Danke –

+0

@StevenDuncan - froh, dass es geholfen hat. Ich finde CASE auf der Select-Seite nützlicher als auf der Where-Seite. – vercelli

1

Wenn ein CASE innerhalb einer WHERE-Klausel, Sie müssen immer noch beide Seiten der Operation definiert haben (dh [CASE CONDITION] = [ETWAS]). Je nachdem, was Sie tun möchten, kann dies schwierig werden, aber am einfachsten ist es, wenn Ihre case-Anweisung als wahr/falsch-Bedingung ausgeführt wird, sodass Sie mit [CASE] = 1 oder [CASE] = 0 enden.

in Ihrem Fall (zufällige Wortspiel!):

where i.status IN ('CR','L','O') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (Case 
    When n.OnOrder IN ('0', '') AND (i.OnOrder = 0 or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime)) 
    THEN 1 
    ELSE 0 
    End) = 1 

natürlich als eine andere Antwort darauf hingewiesen hat, ist ein Fall, nicht wirklich in diesem speziellen Fall notwendig. Wenn Sie jedoch komplexere Bedingungen hätten, könnte dies hilfreich sein.

+0

Vielen Dank, dass Sie mir Fälle erklärt haben. Ich habe nicht gemerkt, dass du es gleichzusetzen hast. Dies wird hilfreich sein, wenn ich weiterhin SQL lerne. –

+0

@StevenDuncan müssen Sie nur vergleichen, wenn Sie es in einer WHERE-Klausel verwenden. Sie können auch 'CASE' in einem' SELECT' verwenden und dann würden Sie den Vergleich überhaupt nicht machen. Interessanterweise können Sie auch 'CASE' in einem' ORDER BY' verwenden, um eine dynamische Sortierung durchzuführen. Wie Sie das SQL strukturieren, hängt vom jeweiligen Kontext ab. – Joel