2012-09-13 159 views
2

我不知道如何在sql中写入查询。
这是我到目前为止所尝试过的。我可以在WHERE子句中使用CASE表达式吗?

where 
    case 
     when a.book_id like 'AB%' then a.book_id = b.school_id, --1 
     when a.book_id like 'CB%' then a.book_id = b.college_id. --2 
    end 


壳体1和2解释。

1-我相信很好。
2-时a.book与字母CB开始e.g CBQ123然后只取Q123 = b.college_id

b.college_id在它前面没有CB。

编辑添加例如

select 
     a.Name, 
     a.ID, 
     a.Due, 
     b.school_id, 
     b.college_id 
from Student a and FinishedStudent b 
where 
    case 
     when a.book_id like 'AB%' then a.book_id = b.school_id, --1 
     when a.book_id like 'CB%' then a.book_id = b.college_id. --2 
    end 

如果a.book = CBQ111然后Q111是FinishedStudent表不CBQ11,所以我只是需要比较最后3个字符。

编辑与案例2例

when a.book_id ='CBQ111' then a.book_id(Q111) = b.college_id. --2 
+1

请提供采样数据和一个例子的结果集像[这个问题](http://stackoverflow.com/questions/12358842/how-to-get-distinct-rows-with-max-value/ )。您可以在标题中指定SQL Server,但在标记中指定MySQL和Oracle。你能澄清你正在使用哪种产品? –

+0

为什么不能在查询的select部分做同样的事情? –

+0

book_id为何等于school_id或college_id?我在这里看到严重的数据模型问题。此外,为什么它标记了SQL Server和Oracle?这两个平台的语法可能会有所不同。 –

回答

6

只是一个小的语法问题。在T-SQL中,CASE是一个返回值的表达式,因此您需要将输出与某些内容进行比较 - 它不像VB等其他语言中的流控制语句那样。

where a.book_id = case 
     when a.book_id like 'AB%' then b.school_id --1 
     when a.book_id like 'CB%' then b.college_id --2 
    end 

基于在评论中添加题扰,也许你实际上是经过是这样的:

WHERE (a.book_id LIKE 'AB%' AND a.book_id = b.school_id) 
    OR (a.book_id LIKE 'CB%' AND SUBSTRING(a.book_id, 3, 255) = b.college_id) 

还有其他的方法来编写最后一行,但如果book_id有索引LIKE过滤器可能仍然有帮助。

+0

我写了同样的答案,然后我问自己:这里不是'ELSE'吗?如果'a.book_id'不符合任何这些条件? – bfavaretto

+0

@bfavaretto然后行不返回。我们只能处理我们提供的信息。 –

+0

所以你的意思是'CASE'会返回'NULL'或类似的东西在这种情况下?这是有道理的。 – bfavaretto

0

编辑:纠正的问题和清理代码。

你可以把它在WHERE子句中,但我更愿意把它的加入。

select 
     a.Name, 
     a.ID, 
     a.Due, 
     b.school_id, 
     b.college_id 
from Student a 
    join FinishedStudent b on a.book_id = 
    case 
     when a.book_id like 'AB%' then b.school_id, --1 
     when a.book_id like 'CB%' then b.college_id. --2 
    end 
+0

这对我来说似乎并不正确;它看起来像一个布尔表达式。你需要将输出与某些东西进行比较。 –

+0

谢谢,是一个错字。我仔细研究了一下,并做了一些修改。 – wtjones

相关问题