3 Stimmen

Bedingungen in der SQL SELECT-Anweisung angeben

Ich muss eine SQL-Abfrage auf der Grundlage von Bedingungen ausführen. Es gibt 2 AND-Bedingungen, die nur ausgeführt werden müssen, wenn die if-Bedingungen für sie erfüllt sind. Können wir hier die CASE-Anweisung verwenden. Wenn ja, wie? Oder gibt es irgendwelche anderen Methoden?

SELECT * FROM MyTable
WHERE col1=@val1

if condition1 here
AND col2 = @val2
end if

if condition2 here
AND col3 = @val3
end if

Kann mir jemand dabei helfen? Ich verwende Sql Server 2005.

8voto

Patrick Karcher Punkte 22087

Nehmen Sie sie in Ihre Anfrage auf, etwa so:

SELECT * FROM MyTable
WHERE col1=@val1
And (Not Condition1 Or col2 = @val2)
And (Not Condition2 Or col3 = @val3)

Also, wenn Nicht Not Condition1 (bedeutet: Condition1 ist wahr) Then col2 (must) = @val2.

(Ich habe die 2. bedingte Logik in AND col3 = @val3 geändert, weil Sie AND wiederholt hatten col2 = @val2 )

bearbeiten als Antwort auf den Kommentar: Geben Sie mir ein Beispiel für die Kriterien für Bedingung 1. Ausdrücklich wenn Syntax wird innerhalb von Abfragen in t-sql nicht verwendet. Nehmen wir an, die "vorherigen Bestellungen" müssen weniger als 20 sein, damit das erste Kriterium von Bedeutung ist, und das zweite Kriterium ist von Bedeutung, wenn es keinen Vornamen gibt. Das wäre dann so:

SELECT * FROM MyTable
WHERE col1=@val1
And (MyTable.OrderCount > 19 Or col2 = @val2)
And ((Not MyTable.FirstName Is Null) Or col3 = @val3)

Denken Sie nicht im Sinne von "dieses Kriterium ist wichtig, wenn diese Situation wahr ist". Alle Faktoren, die von Bedeutung sind, fließen in die Where-Klausel ein. Sie müssen das Oder/And/Nicht und die Reihenfolge der Operationen verstehen. Dies erfordert Übung, um gut zu werden. Wenn Sie ein paar Minuten darüber nachdenken müssen, machen Sie sich keine Sorgen, das geht uns allen manchmal so.

2voto

david a. Punkte 5209

Angenommen, die Bedingungen können als SQL-Ausdrücke geschrieben werden:

SELECT * FROM MyTable
WHERE col1=@val1 AND
(NOT(condition_1) OR col2 = @val2) AND
(NOT(condition_2) OR col3 = @val3)

1voto

Eduardo Punkte 7291
SELECT * FROM MyTable
WHERE col1=@val1 AND ((condition1 AND col2=@val2) OR (condition2 AND col2=@val2))

Wenn also Bedingung 1 wahr ist, wird col2=@val2 ausgewertet, wenn Bedingung 1 falsch ist, wird OR (Bedingung 2) aufgerufen und dasselbe getan.

1voto

NotMe Punkte 86089

Zwei sehr wichtige Seiten, die Sie lesen sollten, sind:

Die folgenden Ausführungen beziehen sich auf SQL 2000 und SQL 2005 http://www.sommarskog.se/dyn-search-2005.html

Diese ist spezifisch für SQL 2008. http://www.sommarskog.se/dyn-search-2008.html

1voto

gbn Punkte 407102

Wenn die Spalten nicht löschbar sind (und nicht kritisieren, sondern ausprobieren )

SELECT
   *
FROM
   MyTable
WHERE
   col1 = @val1 AND
   col2 = ISNULL(@val2, col2) AND
   col3 = ISNULL(@val2, col3)

Andernfalls (Neukompilierung auf Anweisungsebene macht es auf SQL Server 2005+ akzeptabel)

if condition1 here
  SELECT * FROM MyTable
  WHERE col1=@val1AND col2 = @val2

if condition2 here
  SELECT * FROM MyTable
  WHERE col1=@val1AND col3 = @val3

else
 SELECT * FROM MyTable
 WHERE col1=@val1

Oder nutzen Sie die anderen angebotenen Lösungen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X