我可以在WHERE子句中使用CASE表达式吗?

时间:2012-09-13 18:42:49

标签: sql sql-server

我不确定如何在sql中编写查询。
这是我到目前为止所尝试过的。

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开头,例如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

2 个答案:

答案 0 :(得分: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过滤器可能仍然有用。

答案 1 :(得分: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