SQL Bedingte Wo

stimmen
8

Ich habe eine gespeicherte Prozedur namens spGetOrders, die einige Parameter akzeptiert: @StartDate und @enddate. Dieser fragt eine „Bestellung“ Tabelle. Eine der Spalten in der Tabelle „ClosedDate“ genannt. Diese Spalte NULL halten, wenn ein Auftrag oder ein Datumswert nicht geschlossen wurde, wenn es hat. Ich möchte einen @Closed Parameter hinzuzufügen, die einen Bit-Wert nehmen. In einer einfachen Welt, würde ich in der Lage sein zu tun ..

select * from orders o
where o.orderdate between @startdate AND @enddate
and (if @Closed = 1 then o.ClosedDate IS NULL else o.ClosedDate IS NOT NULL)

Offensichtlich das wird nicht funktionieren .. Ich bin auch bei dynamischen SQL-Suche, die mein letztes Mittel ist, aber wie die Antwort aussehen beginnen ..

Bitte helfen ..

Veröffentlicht am 09/12/2008 um 17:42
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
14

Versuche dies:

select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 And o.ClosedDate IS NULL) Or (@Closed = 0 And o.ClosedDate IS NOT NULL))

Seien Sie variieren vorsichtig und das Mischen und OR ist in der where-Klausel. Wenn dies zu tun, um die Klammer zu steuern die Reihenfolge der Auswertung sehr wichtig ist.

Beantwortet am 09/12/2008 um 17:48
quelle vom benutzer

stimmen
2

SQL-Anweisung:

SELECT *  
FROM orders  
WHERE orderdate BETWEEN @startdate AND @enddate  
AND (@Closed = 1 OR CLosedDate IS NOT NULL)
Beantwortet am 09/12/2008 um 17:46
quelle vom benutzer

stimmen
0

Basicly, schreiben Sie es heraus.

select * from orders o
where o.orderdate between @startdate AND @enddate
and ((@Closed = 1 and o.ClosedDate IS NULL)
    or (@Closed != 1 and o.ClosedDate IS NOT NULL))

Doppel, kann entfernt werden,

Beantwortet am 09/12/2008 um 17:50
quelle vom benutzer

stimmen
0

Oder dieses:

select * from orders o
where o.orderdate between @startdate AND @enddate
and (  (@Closed = 1 AND o.ClosedDate IS NULL)
     OR (ISNULL(@Closed, 0) <> 1 AND o.ClosedDate IS NOT NULL)
     )

Es sieht aus wie Sie alle Aufträge zwischen zwei Daten wollen die inkonsistent Schließen Informationen. Die anderen Vorschläge sind wahrscheinlich so gut (oder besser), aber ich bin mir ziemlich sicher, dass dies funktioniert und lesbar ist mir (die meisten anderen Vorschläge erschienen als ich tippte).

Viel Glück!

Beantwortet am 09/12/2008 um 17:48
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more