29 Stimmen

Wie erstelle ich eine bedingte WHERE-Klausel?

Ich benötige eine bedingte WHERE-Klausel, die wie folgt funktioniert:

Select *
From Table
If (@booleanResult)
Begin
  Where Column1 = 'value1'
End
Else
Begin
  Where column1 = 'value1' and column2 = 'value2'
End

Jede Hilfe wäre geschätzt.

48voto

sazh Punkte 1772

Könnten Sie einfach das Folgende tun?

SELECT
    *
FROM
    Table
WHERE
    (@booleanResult = 1
    AND Column1 = 'value1')
OR
    (@booleanResult = 0
    AND Column1 = 'value1'
    AND Column2 = 'value2')

16voto

JNK Punkte 60318

Sie können Bedingungen leicht in einer WHERE-Klausel gruppieren:

WHERE
   (@BooleanResult=1 AND Column1 = 'value1')
ODER
   (@BooleanResult=0 AND Column1 = 'value1' UND Spalte2 = 'value2')

6voto

Basierend auf dem Skript in Frage scheint es, als ob Sie die Bedingung für Column1 benötigen, unabhängig davon, ob die Variable @booleanResult auf true oder false gesetzt ist. Daher habe ich diese Bedingung zur WHERE-Klausel hinzugefügt und in der verbleibenden Bedingung überprüft, ob die Variable auf 1 (true) eingestellt ist oder ob sie auf 0 (false) gesetzt ist, dann wird auch die Bedingung auf Column2 überprüft.

Dies ist nur eine weitere Möglichkeit, dies zu erreichen.

Skript erstellen und einfügen:

CREATE TABLE MyTable
(
    Column1 VARCHAR(20) NOT NULL
  , Column2 VARCHAR(20) NOT NULL
);

INSERT INTO MyTable (Column1, Column2) VALUES
  ('Wert1', ''),
  ('',       'Wert2'),
  ('Wert1', 'Wert2');

Skript, wenn die Bit-Variable auf 1 (true) gesetzt ist:

DECLARE @booleanResult BIT
SET @booleanResult = 1

SELECT      *
FROM        MyTable
WHERE       Column1 = 'Wert1'
AND         (        @booleanResult = 1
                OR  (@booleanResult = 0 AND Column2 = 'Wert2')
            );

Ausgabe:

COLUMN1 COLUMN2
------- -------
Wert1  
Wert1  Wert2

Skript, wenn die Bit-Variable auf 0 (false) gesetzt ist:

DECLARE @booleanResult BIT
SET @booleanResult = 0

SELECT      *
FROM        MyTable
WHERE       Column1 = 'Wert1'
AND         (        @booleanResult = 1
                OR  (@booleanResult = 0 AND Column2 = 'Wert2')
            );

Ausgabe:

COLUMN1 COLUMN2
------- -------
Wert1  Wert2

Demo:

Hier klicken, um die Demo in SQL Fiddle anzusehen.

2voto

Gordon Linoff Punkte 1198148

Um eine kürzere Antwort zu geben:

Wählen * 
Aus Tabelle
Wo Spalte1 = 'Wert1' und
      coalesce(Spalte2, '') = (Fall, wenn @BooleanResults = 0 
                                    dann 'Wert1' 
                                    sonst coalesce( Spalte2, '')
                               end)

0voto

Pavan Muppalla Punkte 1

Abfrage 1: Wenn der @CompanyID auf -1 gesetzt ist, werden alle Datensätze ausgewählt

Abfrage 2: Wenn der @CompanyID auf 10 oder 11 oder 12 gesetzt ist, werden nur die Datensätze ausgewählt, bei denen die companyid=@CompanyID ist

Declare @CompanyID int
Set @CompanyID = -1

select * from sales 
where  1=IIF(@CompanyID =-1, 1, IIF(CompanyID =@CompanyID,1,0))

Set @CompanyID = 10
select * from sales 
where  1=IIF(@CompanyID =-1, 1, IIF(CompanyID =@CompanyID,1,0))

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