2013-05-12 4 views
1

Я написал следующий оператор sql, но я не уверен, как написать оператор where, потому что он является условным. Поэтому у меня есть:SQL conditional where statement

declare @subject varchar(100) 

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

что я тогда хочу написать, как SQL является:

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 = '' 

Я предполагаю, что это может быть сделано логически или, возможно, с помощью case, но я на немного потери в данный момент.

Вот таблицы:

Student

UPN | Surname | Forename | KS2en | KS2Ma | KS2av 

Тема

UPN | Subject 

Все это VARCHAR.

+0

@marc_s сделал мат. – Matt

+0

Показать все столбцы + типы вовлеченных таблиц, 'display' также столбца или просто другое слово для' then do ... '? Покажите некоторые данные образца и желаемый результат. –

+0

@TimSchmelter благодарит Тима. Я отредактировал вопрос. Надеюсь, теперь это становится немного яснее. – Matt

ответ

1

Что-то вроде следующего будет делать это.

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 

Я принимаю subject не может быть недействительным. Если это вышеприведенный запрос имеет немного отличающуюся семантику, чем ваш псевдокод.

+0

Хотя на самом деле, если '@ subject' равно' NULL', строки не будут возвращены, так что семантика в целом будет одинаковой. –

+0

Пятно на спасибо! – Matt

1

Where ограничивает количество возвращенных строк, вы хотите вернуть другое значение столбца в соответствии с вашим условием.

Таким образом, вместо того, чтобы использовать Where вы должны включить условие в избранных через 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

спасибо за ваше время на этом Тиме. – Matt