2017-05-03 1 views
0

J'ai le tableau suivant:T-SQL instruction WHERE fonction du paramètre

TABLE1 
| ID | NAME | TYPE | COLOR | 
| 1 | APPLE | FRUIT | RED | 
| 2 | BANANA | FRUIT | YELLOW | 
| 3 | LEMON | FRUIT | YELLOW | 
| 4 | TOMATO | VEGET | RED | 
| 5 | PEPPER | VEGET | RED | 
| 6 | PEAR | FRUIT | GREEN | 

Et les champs de saisie @TYPE et @COLOR. Si @TYPE = '*' et @COLOR = '*' alors:

SELECT * 
FROM TABLE1 

autrement, si @TYPE = 'VEGET' et @COLOR = '*':

SELECT * 
FROM TABLE1 
WHERE TYPE = 'VEGET' 

si @TYPE = '*' et @COLOR = 'YELLOW':

SELECT * 
FROM TABLE1 
WHERE COLOR = 'YELLOW' 

et le dernier cas, si @TYPE = 'VEGET' et @COLOR = 'YELLOW':

SELECT * 
FROM TABLE1 
WHERE TYPE = 'VEGET' 
AND COLOR = 'YELLOW' 

De toute évidence, il est non seulement deux champs ou paramètres ...
Comment puis-je écrire une requête efficace pour vérifier tous les cas?

Répondre

1
SELECT * 
FROM TABLE1 
WHERE 
    (TYPE = @TYPE OR @TYPE='*') 
AND 
    (COLOR = @COLOR OR @COLOR='*') 
0

Si vous filtrez de nombreuses valeurs, vous pouvez créer une instruction dynamique T-SQL. Par exemple:

  1. d'abord déclarer la déclaration de base:

    DECLARE @DynamicSQLStatement NVARCHAR(MAX); 
    
    SET @DynamicSQLStatement = 'SELECT * FROM TABLE1' 
    
  2. vérifier ensuite si un filtrage est appliqué (si oui, ajoutez WHERE):

    IF @Type <> '*' OR <> @Color <> '*' OR ... 
    BEGIN; 
        SET @DynamicSQLStatement = @DynamicSQLStatement + ' WHERE 1=1 '; 
    END; 
    
  3. ajouter ensuite vérifier pour chaque paramètre:

    IF @Type <> '*' 
    BEGIN; 
        SET @DynamicSQLStatement = @DynamicSQLStatement + ' AND @Type = ' + @Type; 
    END; 
    
    IF @Color <> '*' 
    BEGIN; 
        SET @DynamicSQLStatement = @DynamicSQLStatement + ' AND @Color = ' + @Color; 
    END; 
    
  4. Enfin, exécutez l'instruction:

    EXEC sp_executesql @DynamicSQLStatement; 
    

Il est bien parce que dans la déclaration finale, le filtrage spécifié est inclus. Dans certains scénarios de filtrage complexes, cela peut améliorer les performances.

Quelques remarques importantes:

  • vous n'êtes pas autorisé à utiliser cette fonction en, procédure stockée uniquement (ce qui est la limitation);
  • vous devez échapper des guillemets simples dans les chaînes (en utilisant doubles guillemets simples)
  • si votre valeur de paramètre est un nombre, vous devez jeter à la chaîne