2011-01-12 4 views
0

Je veux avoir une condition simple dans ma clause where, sur l'une des colonnes comme:confusion clause where dans SQL Server

Quand @PostTypeid is null alors devrait être PostTypeid in (4,5) et si @PostTypeid is not null alors où la clause devrait être J'essaie d'utiliser cas à cet effet, mais je pense que je suis confus avec la syntaxe. Voici ce que je suis venu avec jusqu'à présent:

(PostTypeid = case(@PostTypeId) when null then in (4,18) else @PostTypeId end) 

L'erreur est quand je l'utilise dans, je ne pense pas que c'est une syntaxe valide. Quelle est la bonne façon de faire cela? Merci. Je ai essayé de déplacer les accolades à plusieurs autres endroits, mais en vain.

Merci

+0

J'ai même utilisé '' (case (@PostTypeId) quand null puis PostTypeId dans (4, 18) sinon PosttypeId = @PostTypeId end) '' et sql n'a pas du tout aimé ça! – iamserious

+0

Votre logique n'a pas de sens. @PostTypeid peut être nul et 4 en même temps? – gbn

+0

@gbn: si 4 ou 18 est passé, alors j'ai besoin de sélectionner les messages dans ce type d'id, si rien n'est passé (null est passé), je veux sélectionner les messages des deux id. Est-ce que ma logique dit qu'elle peut être nulle et 4 en même temps? Je ne peux pas le voir (prolly à cause de la bière que j'ai eu hier) pouvez-vous s'il vous plaît expliquer plus? – iamserious

Répondre

8

Quelque chose comme:

WHERE 
    (@PostTypeID IS NULL AND PostTypeId IN (4, 5)) OR 
    (@PostTypeId IS NOT NULL AND PostTypeID = @PostTypeID) 

peut-être?

+0

d'oh! Facepalm! pourquoi n'ai-je pas pensé à ça! Merci Matt! Je suppose que j'étais obsédé par la résolution du problème avec ** cas **. stupide moi (ou stupide la bière que j'avais hier - je pense que j'en avais un de trop!) – iamserious

+0

Il y a une légère discordance d'accolades dans votre code Mr. Matt, c'est censé être '' ((@PostTypeID IS NULL ET PostTypeId IN (4, 18)) OR (@PostTypeId n'est pas NULL et PostTypeID = @PostTypeID)) '' mais je suis sûr que vous vouliez que ce soit cela. Merci beaucoup! – iamserious

+0

oh mais bien sûr, je n'ai pas mentionné que j'ai d'autres conditions dans ma clause et c'est juste un d'entre eux, donc votre code est parfait si c'était la seule condition, mon erreur, désolé! – iamserious

-2

Vous utilisez cant = et les opérateurs dans une déclaration

EDIT:

(PostTypeid = cas (@PostTypeId) lorsque nulle puis dans (4,18) end else @PostTypeId) Si le @PostTypeId est nul alors il ira comme ceci.

(PostTypeid = in (4,8)) 

et ceci est une erreur de syntaxe.

case(@PostTypeID) when IS NULL then PostyTypeId in (4,18) else PostTypeId = PostTypeId 

ce cas devrait renvoyer un résultat unique.

+0

pouvez-vous s'il vous plaît expliquer plus loin? – iamserious

+0

Salut, j'ai déjà essayé cette version avant de poster ici.En fait, si vous voyez mon commentaire sur ma question, je l'ai déjà mentionné. cela ne fonctionne pas du tout. – iamserious

+0

Je n'étais pas sûr de cet éther, mais vous avez la réponse. Donc problème résolu. ;-). Et aussi j'ai fait une faute de frappe au lieu de cant je peux écrit ... cela explique ces deux votes. –