2017-01-20 6 views
0

ich eine SQL Server-Abfrage, die einige Daten unter Verwendung von Filtern:SQL, wie bedingte umfasst, in denen Klausel

and datepart(mm,cs.timestamp) <= @month 

Ich habe einen Parameter @accumulate, dass, wenn true dann will ich über Logik, aber wenn false dann ich wollen:

and datepart(mm,cs.timestamp) = @month 

Irgendwelche Hinweise darauf, wie man das in der gleichen Zeile?

+0

Können Sie den gesamten Code anzeigen zu trennen? Sie könnten besser mit dynamischem SQL arbeiten. –

+0

Ähnliche Frage zu beachten: http://StackOverflow.com/Questions/2568775/ConditionalOperator-in-SQL-Where-Clause – Fritz

+0

Keine Antwort auf Ihre Frage, mehr von einem Kommentar zum Programmierstil. http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –

Antwort

0

Dies ist ein wenig übersichtlicher sein, dass könnte eine Zeile

(DATEPART(mm,cs.timestamp) = @month 
OR (@accumulate = 1 AND DATEPART(mm, cs.timestamp) < @month)) 

oder mit einem Nicken zu Seans Kommentar (das ist guter Rat)

(DATEPART(MONTH,cs.timestamp) = @month 
OR (@accumulate = 1 AND DATEPART(MONTH, cs.timestamp) < @month)) 

oder, wenn Sie ein kurzes, aber undurchsichtig und böses Stück Code wollen (und @accumulate ist ein bisschen)

SIGN(@month - DATEPART(MONTH, cs.timestamp)) in (0, @accumulate) 
3

Ich bin mir nicht sicher, ob Sie es in einer Zeile tun können. Aber man könnte es in mehreren Zeilen tun:

and ((datepart(mm,cs.timestamp) <= @month and @accumulate = true) 
    or (datepart(mm.cs.timestamp) = @month and @accummulate = false)) 
0

Sie sollten gespeicherte Prozedur mit IF und THEN Anweisung die beiden Bedingungen