2013-05-12 3 views
1

J'ai écrit l'instruction sql suivante, mais je ne sais pas comment écrire l'instruction where car elle est conditionnelle. J'ai donc:Instruction conditionnelle SQL where

declare @subject varchar(100) 

select surname, forename, result 
from student 
join subject on subject.upn = student.upn 
where... 

ce que je veux alors écrire comme sql est:

where 
if subject = 'English' then [email protected] and KS2en='' 
or if subject = 'Maths' then subject = @subject and KS2ma = '' 
or if subject <> 'Maths' and <> 'English' then subject = @subject and KS2av = '' 

Je suppose que cela peut être fait logiquement ou peut-être en utilisant case, mais je suis un peu d'une perte en ce moment.

Voici les tableaux:

étudiants

UPN | Surname | Forename | KS2en | KS2Ma | KS2av 

Sujet

UPN | Subject 

Tous sont varchar.

+0

@marc_s fait compagnon. – Matt

+0

Afficher toutes les colonnes + types de tables concernées, 'display' est-il aussi une colonne ou juste un autre mot pour' then do ... '? Montrer quelques exemples de données et un résultat souhaité. –

+0

@TimSchmelter merci Tim. J'ai édité la question. Espérons que cela rend les choses un peu plus claires maintenant. – Matt

Répondre

1

Quelque chose comme ce qui suit le ferait.

SELECT surname, 
     forename, 
     result 
FROM student 
     JOIN subject 
     ON subject.upn = student.upn 
WHERE subject.subject = @subject 
     AND '' = CASE @subject 
        WHEN 'English' THEN KS2en 
        WHEN 'Maths' THEN KS2ma 
        ELSE KS2av 
       END 

Je suppose que subject n'est pas Nullable. Si c'est la requête ci-dessus a une sémantique légèrement différente de votre pseudo code.

+0

En fait, si '@ subject' est' NULL', aucune ligne ne sera retournée, donc la sémantique globale sera la même. –

+0

Spot sur merci! – Matt

1

Where limite le nombre de lignes renvoyées, vous souhaitez renvoyer une valeur de colonne différente en fonction de votre condition.

Ainsi, au lieu d'utiliser Where vous devez inclure la condition dans la sélection via CASE:

DECLARE @subject VARCHAR(100) 

SELECT surname, 
     forename, 
     [email protected], 
     KS2en=CASE 
       WHEN subject = 'Engish' THEN '' 
       ELSE ks2en 
      END, 
     KS2ma=CASE 
       WHEN subject = 'Maths' THEN '' 
       ELSE ks2ma 
      END, 
     KS2av=CASE 
       WHEN subject NOT IN('Maths', 'English') THEN '' 
       ELSE ks2av 
      END 
FROM student 
     JOIN subject 
     ON subject.upn = student.upn 
+0

merci pour votre temps sur ce Tim. – Matt