Comment filtrer de manière conditionnelle sur une colonne dans une clause WHERE?
OK, la n-ième colonne conditionnelle question:
Je suis en train d'écrire une procédure stockée qui prend un paramètre d'entrée qui est mappé à un de plusieurs drapeau colonnes. Quelle est la meilleure façon de filtre sur la colonne demandée? Je suis actuellement sur SQL2000, mais sur le point de passer à SQL2008, donc je vais prendre une solution moderne si l'on est disponible.
La table interrogée dans la procédure stockée ressemble
ID ... fooFlag barFlag bazFlag quuxFlag
-- ------- ------- ------- --------
01 1 0 0 1
02 0 1 0 0
03 0 0 1 1
04 1 0 0 0
et je veux faire quelque chose comme
select ID, name, description, ...
from myTable
where (colname like @flag + 'Flag') = 1
donc, si j'ai appeler la procédure stockée comme exec uspMyProc @flag = 'foo'
je reviendrais lignes 1 et 4.
Je sais que je ne peux pas faire la part des parens directement en SQL. Dans le but de faire du SQL dynamique, je vais avoir à farcir l'intégralité de la requête dans une chaîne, concaténer les @drapeau param dans la clause where, puis exec de la chaîne. En dehors de la sale impression que j'ai quand faire du SQL dynamique, ma requête est assez grande (je suis de la sélection d'une douzaine de champs, rejoignant 5 tables, en appelant un couple de fonctions), c'est donc un grand géant de la chaîne tout en raison d'une seule ligne dans un 3 ligne de filtre.
En alternance, j'ai pu avoir 4 copies de la requête et sélectionnez parmi eux, dans une instruction case. Cela laisse le code SQL directement exécutable (et sous réserve de sa mise en surbrillance de la syntaxe, etc.) mais au prix de répéter, de gros morceaux de code, car je ne peux pas utiliser le CAS sur la clause where.
Existe-il d'autres options? Toute délicate des jointures ou des opérations logiques qui peuvent être appliquées? Ou devrais-je obtenir juste au-dessus et l'exec SQL dynamique?
source d'informationauteur Val
Vous devez vous connecter pour publier un commentaire.
Il ya quelques façons de le faire:
Vous pouvez le faire avec une instruction case.
Vous pouvez utiliser SI.
Vous pouvez avoir un complexe clause where avec beaucoup de parenthèses.
Vous pouvez le faire avec le sql dynamique:
Il ya plus, mais je pense que l'un de ces vous va.
"En alternance, j'ai pu avoir 4 copies de la requête et sélectionnez parmi eux, dans une instruction case."
Vous n'avez pas besoin de copier l'intégralité de votre requête 4 fois, il suffit d'ajouter toutes les possibilités dans les clauses where de votre seule copie de la requête:
Ce que je voudrais faire est de
CASE
certaines variables au début. Exemple:La bonne chose à propos de cette requête, c'est que, parce que les valeurs possibles pour "flags" sont limités, vous pouvez le calcul de la totalité des conditions des conditions préalables à la place de l'habillage des colonnes. Cela garantit une haute performance de l'indice de chercher sur quel colonnes sont indexées, et ne nécessite pas l'écriture de tout le SQL dynamique. Et c'est mieux que d'écrire 4 requêtes distinctes pour des raisons évidentes.
Vous pourriez avoir un paramètre pour chaque drapeau de la colonne, puis vérifier si le paramètre est null ou la valeur de la colonne est égale à la valeur du paramètre. Ensuite, vous passez en un 1 pour les options que vous voulez vérifier et laisser les autres null.
Honnêtement, même si, ce qui semble être un candidat idéal pour la construction d'une dynamique de requête LINQ et le saut de la procédure stockée une fois que vous obtenez à SQL2008.
de travail
lorsque le companyID est présent , puis de filtration basés sur c'est fait, l'autre sage , la filtration est ignorée.