web-dev-qa-db-fra.com

Comment créer une clause WHERE conditionnelle?

J'ai besoin d'une clause where conditionnelle qui fonctionne comme suit:

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

Toute aide serait appréciée.

22
Yatrix

Pourriez-vous simplement faire ce qui suit?

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

Vous pouvez facilement regrouper des conditions dans une clause WHERE:

WHERE
   (@BooleanResult=1 AND Column1 = 'value1')
OR
   (@BooleanResult=0 AND Column1 = 'value1' AND column2 = 'value2')
13
JNK

D'après le script en question, il semble que vous ayez besoin de la condition pour Column1 indépendamment du fait que la variable @booleanResult est défini sur true ou false. J'ai donc ajouté cette condition à la clause WHERE et dans la condition restante vérifie si la variable est définie sur 1 (true) ou s'il est réglé sur 0 ( false) alors il sera également vérifier la condition sur Column2.

Ce n’est qu’un autre moyen d’y parvenir.

Créer et insérer un script:

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

INSERT INTO MyTable (Column1, Column2) VALUES
  ('value1', ''),
  ('',       'value2'),
  ('value1', 'value2');

Script lorsque la variable de bit est définie sur 1 (vrai):

DECLARE @booleanResult BIT
SET @booleanResult = 1

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

Sortie:

COLUMN1 COLUMN2
------- -------
value1  
value1  value2

Script lorsque la variable de bit est définie sur 0 (faux):

DECLARE @booleanResult BIT
SET @booleanResult = 0

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

Sortie:

COLUMN1 COLUMN2
------- -------
value1  value2

Démo:

Cliquez ici pour voir la démo dans SQL Fiddle.

4
user756519

Pour fournir une réponse plus courte:

Select *
From Table
Where Column1 = 'value1' and
      coalesce(column2, '') = (case when @BooleanResults = 0 
                                    then 'value1' 
                                    else coalesce( column2, '')
                               end)
1
Gordon Linoff