2010-08-10 3 views
2

J'ai une procédure dans laquelle la condition ci-dessous doit être écrite dans une clause WHERE. Comment je fais ça.Conditionnel Check in Où clause

itemid est un paramètre qui peut être nul.

si itemid est disponible puis l'ajouter à ma clause where, sinon rien

+0

si vous voulez que les gens vous aident d'abord à comprendre votre problème. que voulez-vous dire par "ça ne marche pas"? Quelle est la requête complète? – Andrey

+0

si ItemID est NULL alors il ne devrait pas chercher des lignes? ou devrait-il aller chercher le rownum entre Row_Start et Row_End? –

Répondre

3

Certaines personnes utilisent cette technique

... WHERE @itemid IS NULL OR tbl.itemid = @itemid 

Il garantit cependant que vous ne serez jamais un recherche d'index sur la colonne itemid .

Une meilleure approche si la table est tout grand est de diviser la requête en 2 cas distincts

IF(@itemid IS NULL) 
    SELECT foo FROM bar 
ELSE 
    SELECT foo FROM bar WHERE itemid = @itemid 

Si le nombre de combinaisons est trop grande, vous pouvez envisager SQL dynamique. Assurez-vous de comprendre l'injection SQL en premier.

Ref: Dynamic Search Conditions in T-SQL

+0

Etes-vous sûr que l'itemid d'index n'est pas utilisé si nous avons '@itemid IS NULL OU tbl.itemid = @ itemid'. Selon les tests de tournée, son utilisation des index. Peut-être que votre réponse est trop vieille? – user960567

2

par exemple

SELECT Something 
FROM SomeTable 
WHERE (@MyParam IS NULL OR SomeField = @MyParam) 
    AND AnotherField = 1 

Vous aurez envie de tester cela dans votre scénario spécifique pour la performance. Si c'est une requête simple, c'est-à-dire sans beaucoup de paramètres conditionnels, vous pouvez essayer ceci à la place pour la performance: