SQL - CAS de l'expression à l'intérieur OÙ
J'ai lu sur l'utilisation de l'expression case à l'intérieur de la clause where ici:
http://scottelkin.com/sql/using-a-case-statement-in-a-sql-where-clause/
Je suis en train de l'utiliser pour filtrer les résultats de mon instruction select, basé sur un numéro de contrat qui sera passé par l'application de l'utilisateur. Mon code actuellement déclenche une erreur de 'Invalide paramètre' peu importe ce qui est passé. J'ai vérifié SÉLECTION/à PARTIR de fonctionnent très bien, comme lorsque que la clause where, sans une expression case. Voici mon code.
WHERE (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END =
tblContracts.ContractNo)
La redondance du code est pour des fins de dépannage, je suis à la planification sur l'utilisation générique de filtrage sur le CAS plus tard. Je me concentre sur l'obtention de la syntaxe en bas à droite maintenant. Je crois que ce doit retourner tous les enregistrements pour lesquels le paramètre correspond au numéro de contrat stockées dans la table. De l'aide ou des conseils seraient grandement appréciés.
OriginalL'auteur | 2009-01-05
Vous devez vous connecter pour publier un commentaire.
Après la lecture de votre explication, il y a une meilleure façon de le faire sans
CASE
:Ce sera de retour que de correspondance des numéros de contrat, à moins que
@ContractNo
est 0, auquel cas il sera de retour tous les records.Edit: j'ai juste remarqué que casperOne proposé la même chose. Je ne savais pas que l'. Big up à vous-même.
Depuis récursive résolu votre problème, il le faut "accepter" sa réponse avec le big green case.
OriginalL'auteur recursive
Êtes-vous sûr de vouloir faire cela? Votre cas énoncé renvoie TOUJOURS
@ContractNo
. Je pense que ce que vous cherchez est: est-ceLe filtre ci-dessus, dit "donnez-moi le contrat où le
ContractNo
égale au paramètre, ou la totalité d'entre eux si le paramètre est de 0.Le filtre précédent seulement filtré où le champ numéro de contrat est exactement égale à la valeur du paramètre.
En soit, vous devriez faire ceci à la place:
La logique est beaucoup plus facile à comprendre, et pour couronner le tout (ne pas me citer sur ce sujet), l'optimiseur sera probablement mieux travailler à l'extérieur de l'instruction de cas.
OriginalL'auteur casperOne
Essayez de laisser les parenthèses qui sont à la mauvaise place de toute façon - le droit de l'un devrait l'être après la "FIN".
En fait, c'est se plaindre d'un paramètre, pas une variable. Mais vous avez raison, il pourrait être un mal mis en valeur de paramètre.
OriginalL'auteur dkretz
Peut-être que vous avez oublié de déclarer @ContractNo? Est-il comparable à 0 et à tblContracts.ContractNo?
OriginalL'auteur Manu
Récursive post résolu mon problème précisément.
J'ai vu des plaintes au sujet de la clarté de mon post original. Dans l'avenir, que puis-je faire pour faire ce que je dis plus simple? Je n'ai pas l'habitude de phrasé questions au sujet du code, et de s'excuser pour toute confuse des choses qu'elle avait. Ai-je juste besoin de fournir à l'étendue des détails comme dans mon 2ème post?
Merci encore pour toute l'aide que.
Pour une chose, vous devez inclure votre mise à jour comme une modification à la question d'origine, au lieu de le poster comme une solution complémentaire. Quant à la question, il aurait été préférable d'utiliser un exemple de code qui n'ont pas de réduire à rien, et/ou de dire ce que votre objectif final était dans le post original.
Et oh oui, si ma solution était la personne qui a résolu votre problème, il le faut "accepter", en le marquant comme la solution retenue.
Merci, désolé pour tout ça.
OriginalL'auteur
Déplacer votre fin de parenthèse avant de l' = comme ceci:
Je ne vois pas en quoi ce cas, déclaration bien... vous êtes de retour la même chose dans le cas où le @ContractNo = 0 ou si ce n'est pas...
La syntaxe correcte est:
Indépendamment de la syntaxe cependant, votre exemple ne fait pas beaucoup de sens, si vous êtes à la recherche pour tous les éléments qui correspondent ou qui ont un Numéro de Contrat de 0, alors vous feriez:
Qui semble faire beaucoup plus de sens que ce que vous tentez d'utiliser l'instruction case.
Edit: je devais avoir mal lu la question un peu - le manque param signifie généralement que le paramètre (dans ce cas @ContractNo) n'est pas déclarée dans le cadre de vos requête ou à une procédure. Mais quelqu'un l'a déjà fait observer, je ne peux pas prendre tout le crédit pour cela.
B: je suis absent de votre point quelque part ici. Étant donné le manque de clarté de la question, comment décidez-vous ce qui est droit?
Oui, vous avez raison. Question manque de clarté (c'est pourquoi je n'ai pas répondu encore). Cependant, son lien et son code show "recherche de CAS" et votre syntaxe montre l'exemple de "CAS simple".
B: Cas Simple est: Cas <Condition> Lors de la... et de Cas Recherché est: le Cas Lors de la <Condition> Alors... donc j'ai utilisé la syntaxe correcte pour un cas recherché, ce qui me manque?
OriginalL'auteur BenAlabaster
La raison de l'instruction du cas, y compris l'ensemble de la "Si c'est 0, donner à ce paramètre, et sinon, il suffit de donner le paramètre" était à l'essai pour essayer d'obtenir la syntaxe de droit. A l'origine, j'avais essayé de dire "Si c'est 0, puis la passer dans '%', pour retourner à chaque valeur. Le code que j'ai posté là-bas était parce que j'ai continué à obtenir 'Invalide Paramètre' et compris, il doit y avoir quelque chose de mal avec ma syntaxe. Quand je les ai séparés en correspondance des paramètres de base comme,
il a renvoyé les dossiers de l'amende. Laissez-moi vous expliquer un peu plus.
Je suis en tirant à partir d'un tas de différentes tables, et le filtrage du contenu avec des informations non inclus dans l'instruction select (c'est à dire tblContracts n'est pas d'avoir de l'information tirée par Sélectionner, il n'est utilisé que dans le Où). À l'utilisateur de sélectionner à partir d'une liste déroulante qui ont les différents numéros de contrat, ainsi qu'une valeur par défaut de "Tous".
Je vais avoir un événement lorsque l'index de la liste déroulante de la boîte de changements. Si c'est 'All', 0 sera transmise en tant que paramètre et je veux pas de filtrage fait. Sinon, je veux juste les informations concernant le numéro de contrat (la raison pour Autre chose @ContractNo).
OriginalL'auteur
Voulez-vous dire quelque chose de ce genre?
Où @ContractNo est variable du même type de données que tblContracts.ContractNo
OriginalL'auteur Richard L
Pourquoi avez-vous encore besoin d'une instruction de cas?
Quand @ContractNo = 0 alors ( 0 = tblContracts.ContractNo)
d'autre @ContractNo ensuite (@ContractNo = tblContracts.ContractNo)
Cela n'a aucun sens puisque vous pouvez simplement écrire ce que
Où @contractNo = tblContracts.contractNo
OriginalL'auteur Eppz
Est le numéro de contrat du fait d'un numérique ou une chaîne de caractères qui arrive toujours à être un numérique. Vérifiez vos types de données entre la table et le paramètre et l'instruction de CAS (par exemple, "= 0" ou "= '0'")
OriginalL'auteur Tom H
Cette syntaxe doit fonctionner (il n'en Oracle)
OriginalL'auteur JosephStyons
quand vous dites:
Puis il me semble que devrait avoir un "Où existe une clause". depuis votre pas en tirant toutes les informations de cette table?!
OriginalL'auteur Richard L