2010-05-21 5 views
0

Salutations, Je souhaite inclure CASE Déclaration dans mon où énoncé comme suit:de cas dans les instruction WHERE

SELECT a1.ROWGUID FROM Table1 a1 
INNER JOIN Table2 a2 on a1.ROWGUID=a2.Table1ROWGUID 
WHERE a1.Title='title' 
AND (CASE WHEN @variable is not null THEN a1.ROWGUID in (SELECT * FROM #TempTable)) 

Cependant, cette déclaration « cas » ne fonctionne pas dans la déclaration « Où? ». Comment puis-je le faire correctement?

Répondre

2

Il vous manque END et peut-être aussi une AUTRE:

(CASE WHEN @variable is not null THEN a1.ROWGUID ELSE ... END) 
2

Vous devez faire quelque chose comme ceci:

WHERE a1.Title = 'title 
AND  (@variable IS NULL 
OR  a1.ROWGUID IN (SELECT * FROM #TempTable)) 

Je devine un peu parce que votre déclaration de cas est incomplète.

1

Une instruction CASE est utilisée pour renvoyer une variable et non pour évaluer un prédicat.

Par conséquent, vous pouvez faire

WHERE CASE WHEN @test1 = 'valuea' THEN 1 ELSE 2 END = MyTestColumn 

pour comparer 1 ou 2 avec votre colonne en fonction de certaines variables (ou autre colonne), mais pas de la façon dont vous avez essayé.

La réponse de David M est la bonne façon de faire ce que vous devez faire.

1

Une autre alternative.

SELECT a1.ROWGUID FROM Table1 a1 
INNER JOIN Table2 a2 on a1.ROWGUID=a2.Table1ROWGUID 
INNER JOIN #TempTable ON (@variable is null) OR #TempTable.ROWGUID = a1.ROWGUID 
WHERE a1.Title='title' 

Si cela est un nombre important de lignes que vous voudrez peut-être prudent sur les questions de mise en cache du plan avec toutes ces alternatives et juste diviser en 2 déclarations alternatives bien.

Questions connexes