2010-05-27 3 views
2

J'essaie de construire une instruction T-SQL avec une clause WHERE déterminée par un paramètre d'entrée. Quelque chose comme:Est-il possible d'utiliser CASE avec IN?

SELECT * FROM table 
WHERE id IN 
CASE WHEN @param THEN 
(1,2,4,5,8) 
ELSE 
(9,7,3) 
END 

J'ai essayé toutes les combinaisons de déplacer l'IN, le CAS etc autour de ce que je peux penser. Est-ce (ou quelque chose comme ça) possible?

Répondre

7

essayez ceci:

SELECT * FROM table 
WHERE (@param='??' AND id IN (1,2,4,5,8)) 
OR (@param!='??' AND id in (9,7,3)) 

cela aura un problème à l'aide d'un index. La clé avec des conditions de recherche dynamiques est de s'assurer qu'un index est utilisé, au lieu de comment je peux facilement réutiliser le code, éliminer les duplications dans une requête, ou essayer de tout faire avec la même requête. Voici un article très complet sur la façon de traiter ce sujet:

Dynamic Search Conditions in T-SQL by Erland Sommarskog

Il couvre toutes les questions et les méthodes d'essayer d'écrire des requêtes avec plusieurs conditions de recherche en option. Ce n'est pas la duplication de code, mais l'utilisation d'un index. Si votre requête ne parvient pas à utiliser un index, il se produira mal. Il existe plusieurs techniques qui peuvent ou non permettre l'utilisation d'un index.

voici la table des matières:

 
    Introduction 
     The Case Study: Searching Orders 
     The Northgale Database 
    Dynamic SQL 
     Introduction 
     Using sp_executesql 
     Using the CLR 
     Using EXEC() 
     When Caching Is Not Really What You Want 
    Static SQL 
     Introduction 
     x = @x OR @x IS NULL 
     Using IF statements 
     Umachandar's Bag of Tricks 
     Using Temp Tables 
     x = @x AND @x IS NOT NULL 
     Handling Complex Conditions 
    Hybrid Solutions – Using both Static and Dynamic SQL 
     Using Views 
     Using Inline Table Functions 
    Conclusion 
    Feedback and Acknowledgements 
    Revision History

si vous êtes sur la bonne version de SQL Server 2008, il y a une technique supplémentaire qui peut être utilisé, voir: Dynamic Search Conditions in T-SQL Version for SQL 2008 (SP1 CU5 and later)

Si vous êtes sur cette version correcte de SQL Server 2008, vous pouvez simplement ajouter OPTION (RECOMPILE) à la requête et la valeur de la variable locale au moment de l'exécution est utilisée pour les optimisations.

Considérez ceci, OPTION (RECOMPILE) prendra ce code (où aucun indice peut être utilisé avec ce gâchis de OR s):

WHERE 
    (@search1 IS NULL or [email protected]) 
    AND (@search2 IS NULL or [email protected]) 
    AND (@search3 IS NULL or [email protected]) 

et optimiser au moment de l'exécution à (à condition que seul @ Search2 a été adoptée avec une valeur):

WHERE 
    [email protected] 

et un index peut être utilisé (si vous en avez défini sur Colonne2)

+0

+1 Bonnes ressources – NotMe

0
if @param = 'whatever' 
    select * from tbl where id in (1,2,4,5,8) 
else 
    select * from tbl where id in (9,7,3)