2

我不确定如何在 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
4

2 回答 2

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 过滤器可能仍然有用。

于 2012-09-13T18:53:40.500 回答
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
于 2012-09-13T18:54:18.520 回答