2013-05-12 145 views
1

我写了下面的sql语句,但我不确定如何编写where语句,因为它是有条件的。所以,我有:SQL条件where语句

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做,但我在一个小的损失的在这一刻。

下面是表:

学生

UPN | Surname | Forename | KS2en | KS2Ma | KS2av 

主题

UPN | Subject 

所有都是VARCHAR。

+0

@marc_s做过队友。 – Matt 2013-05-12 20:24:49

+0

显示所涉及表格的所有列+类型,是“显示”还是“还是...”的列或只是另一个词?显示一些示例数据和期望的结果。 – 2013-05-12 20:27:03

+0

@TimSchmelter谢谢Tim。我编辑了这个问题。希望它现在能让事情变得更清楚一些。 – Matt 2013-05-12 20:34:01

回答

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',那么无论如何行都不会被返回,所以整体的语义将是相同的。 – 2013-05-12 21:01:50

+0

感谢! – Matt 2013-05-13 07:58:39

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

感谢您在Tim的时间。 – Matt 2013-05-13 07:59:38