2009-11-02 4 views
2

J'ai une clause where qui vérifie l'existence de lignes dans une sous-requête, mais je veux seulement exécuter ce contrôle si un bit est à 1. Ainsi, par exemple:SQL Server Où déclaration de cas de clause?

Select * from Listing l 
Where 
l.IsDeleted=1 
AND CASE WHEN @MustHasPicture = 1 THEN 
(
    EXISTS 
    (
     SELECT NULL AS [EMPTY] 
     FROM [dbo].[ListingPictures] AS [lp] 
     INNER JOIN Listing l ON lp.ListingID=l.ID 
    ) 
) 
ELSE 1 END = 1 

Cette syntaxe est erronée, et J'espère que quelqu'un peut me diriger dans la bonne direction. Merci.

+0

Qu'essayez-vous de faire avec la requête? –

+0

Si l'utilisateur passe dans @ MustHavePicture = 1, alors je veux seulement retourner les annonces qui ont une image. Si l'utilisateur passe @ MustHavePicture = 0, alors je veux retourner TOUTES les listes, qu'elles aient ou non des images. – Scott

Répondre

3
SELECT * 
    FROM Listing l 
WHERE IsDeleted = 1 
    AND (@MustHasPicture <> 1 OR 
     (@MustHasPicture = 1 AND l.id IN (
       SELECT listingid 
       FROM ListingPictures 
      ) 
     ) 
     ) 
+0

Cela entraîne le retour des mêmes listes dans les deux cas. Ainsi, lorsque @ MustHavePicture = 1, les listes NON illustrées sont renvoyées. Cela m'a semblé être le meilleur candidat ... :( – Scott

+0

c'est ce que je reçois pour ne pas vraiment tester les choses. Edité pour utiliser une autre approche que je n'ai pas testé :-P – iammichael

+0

Oups, mon mauvais. Pour utiliser une clause Where à la place d'une jointure interne, la liste l finit par être un autre alias, plutôt que d'utiliser l'alias d'un niveau supérieur, de sorte que la sous-requête retourne toujours vrai, ce qui a jeté les résultats. – Scott

1

Pas besoin de faire un cas - si la première partie d'un and échoue, la deuxième partie ne sera pas effectuée.

select 
    * 
from 
    Listing l 
Where 
l.IsDeleted = 1 
and ((@MustHasPicture = 1 and exists (...)) or 1) 
+0

Il en résulte une erreur de syntaxe "Expression de type non-booléen spécifiée dans un contexte où une condition est attendue, près ')'." En supprimant le "OR 1" à la fin, il compile, mais alors il ne retourne pas de listes dans le cas où l'utilisateur passe @ MustHavePicture = 0 – Scott

0

Qu'en est celui-ci:

SELECT * FROM Listing l 
WHERE l.IsDeleted = 1 
AND (@MustHasPicture = 1 
    AND EXISTS(SELECT * FROM [dbo].[ListingPictures] AS [lp] 
    WHERE lp.ListingID = l.ID) 
OR @MustHasPicture = 0) 

Mais où la valeur ne @MustHasPicture vient?