2010-06-10 3 views
3

Alors peut-être quelqu'un peut me diriger dans la bonne direction de ce qui cause cette erreur? Je me bats avec ça depuis quelques heures et je fais des recherches sur le web, et je n'arrive pas à comprendre ce que je fais de mal ici. Il est inclus dans le cadre d'une procédure stockée, je ne sais pas si cela compte, si je le peux, je peux inclure cela aussi. Les tables et les noms de champs ont été modifiés pour protéger les innocents ... ce qui signifie mon travail. Merci.Une expression de type non-booléen spécifiée dans un contexte où une condition est attendue, près de 'END'

SELECT 
       /* The fields are here*/ 
FROM 
       /* my joins are here */ 
WHERE 
    (Table.Field = stuff) 
    AND 
    (Table.Field2 = otherstuff) 
    AND 
    (Table2.Field3 = someotherstuff) 
    AND 
    CASE @param1 
     WHEN 0 THEN 'Table.Field IS NULL' 
     WHEN 1 THEN 'Table.Field2 IS NOT NULL' 
     ELSE '' 
    END 

Merci pour les réponses. Techniquement egrunin était la bonne réponse à cette question, mais OMG Ponies et Mark Byers étaient à peu près la même chose qui manquait juste cette dernière pièce. Merci encore.

Répondre

5

Je suis sûr que les autres réponses laissent un cas:

WHERE 
(Table.Field = stuff) 
AND 
(Table.Field2 = otherstuff) 
AND 
(Table2.Field3 = someotherstuff) 
AND 
(
    (@param1 = 0 and Table.Field IS NULL) 
    OR 
    (@param1 = 1 and NOT Table.Field2 IS NULL) 
    OR 
    (@param1 <> 0 AND @param1 <> 1) -- isn't this needed? 
) 
+0

La dernière ligne traitant @ param1 n'est pas nécessaire car elle ne touche pas l'ensemble de résultats. Mais il n'y a pas de mal à être explicite. –

+0

@OMG Poneys: Sans ce dernier test, @ param1 = 2 ne renverra-t-il pas toujours 0 enregistrement? – egrunin

+0

Non, en raison des crochets et du mot clé AND –

2

Vous renvoyez une chaîne à partir de votre expression de cas, mais seul un booléen peut être utilisé. La chaîne n'est pas évaluée. Vous pouvez faire ce que vous voulez utiliser SQL dynamique, ou vous pouvez l'écrire comme ceci:

AND (
    (@param1 = 0 AND Table.Field IS NULL) OR 
    (@param1 = 1 AND Table.Field IS NOT NULL) 
) 
2
  1. Vous ne pouvez pas utiliser CASE dans la clause WHERE comme vous essayez
  2. Le texte que vous avez fourni dans CASE ne ferait courir si vous utilisez SQL dynamique

utilisation:

WHERE Table.Field = stuff 
    AND Table.Field2 = otherstuff 
    AND Table2.Field3 = someotherstuff 
    AND ( (@param1 = 0 AND table.field IS NULL) 
     OR (@param1 = 1 AND table.field2 IS NOT NULL)) 

... qui doe sn't donner un sens si vous avez déjà Table.Field = stuff, etc ...

Les options qui feraient mieux seraient soit de rendre toute la requête SQL dynamique, ou s'il n'y a qu'un seul paramètre - utiliser une instruction IF/ELSE avec séparé interroge & les bonnes clauses WHERE.

Questions connexes