2010-09-08 4 views
1
select * from table where [email protected] 

Je ne sais pas si c'est facile, mais je ne pouvais pas comprendre. Je veux être en mesure de modifier la clause where sur la requête ci-dessus afin que si vous utilisez 0 au lieu de 1-2-3 ou 4 comme @categoryid, il sélectionnerait toutes les catégories. Je n'ai aucune catégorie avec 0 dans la base de données.sql serveur conditionnel où

Répondre

2

Vous pouvez le mettre à NULL lorsque vous souhaitez sélectionner toutes les catégories une sélectionner il suffit de modifier comme celui-ci

select * from table where category= ISNULL(@categoryid, category) 
+0

Pas exactement répond à la question mais c'est propre que l'approche de Matt Gibson, mais nécessite quelques modifications du côté client. –

-2

Ce SQL est pas PL/SQL. Vous devez tester la valeur avant d'envoyer la requête que vous ne pouvez pas demander à SQL de la tester pour vous.

+2

Je vous ai downvoted, parce que je ne pouvais pas comprendre votre argument. –

+0

Assez juste, semble que j'ai parlé au-dessus de ma tête cette fois: D – MaxouMask

3

Cela devrait probablement être divisé en 2 requêtes distinctes, sauf si vous voulez vraiment le même plan d'exécution d'un balayage d'index complet cluster à être utilisé aussi bien dans le cas où @categoryid=0 et @categoryid<>0

En divisant en 2 requêtes distinctes Vous potentiellement autoriser ceux où @categoryid n'est pas zéro pour être satisfait par une recherche d'index plutôt que l'analyse complète.

Si la table est petite ou @categoryid n'est pas très sélectif, cela peut ne pas poser de problème.

1
select * from table where 
category BETWEEN @mincategoryid AND @maxcategoryid 

Min et Max un des

  • être tous les deux 1 (ou 2 ou 3 ou 4)
  • respectivement 0 et un nombre élevé

Cette volonté utiliser un index aussi ..

+0

+1 J'aime cette solution. –

+0

ne fonctionnera pas lorsque la valeur de la colonne est nulle –

+0

@KM: ressemble à une colonne non nullable – gbn