sql查询时,根据特定的条件给表的某一个字段赋值
先讲一下需要这个需求的情景:
这是一个招聘求职项目遇到的一个问题。个人A向公司B的职位投递简历后,公司B会收到个人A的简历;但是A投递后把简历删除,公司收到的简历信箱
还有这个简历,但却不能看了。
原因:B收到的简历放在表[ResumeRecord]里,当B想看A的简历时会去表[Resume]查询(A已经把自己的简历删了,所以找不到了)
针对这一情况,我想到了两种方法:
1.A删除自己的简历时,同时把自己的投递记录删除;
2.完善B收收到的简历信箱列表。当A把自己的简历删除后,B只能看这条记录,不能看A的详细信息。在这条记录旁给出【此简历已被该用户删除】的注释;
接下来分析一下这两种方法,方法一虽然能解决程序的异常问题,但是对于B是不公平了。(A删除之前是可以看的,删除后怎么就没有了呢?会不会很怪。)
所以果断采取方法二。实现方法二有两种方式,一是在查询记录的时候,对每一条记录查询一次,查看这条记录的简历是否存在(效率慢了),二是写成一个sql
查询。
select top 15 * from ( select 'Note'= case when b.ID IS NULL then '此简历已被该用户删除' else '' end, a.ID, a.[Type], a.UserId, a.SubjectId, a.AreaId, a.CompanyId, a.ResumeId, a.SpendType, a.UpdateTime, a.CreatTime, a.Remark, a.AreaPid, a.SubjectPid, a.IsEmailPost, row_number() over (order by a.ID Desc) as r from [ResumeRecord] a left join [Resume] b on a.ResumeId = b.ID where ( type= 2 or type= 1 ) and CompanyId=158732 ) t where t.r>0 order by t.ID Desc
这个sql可以查出想要的结果,但是当时用的是封装好的实体(这里就不细说了),所以到控制器里却无法取出自定义字段[Note]的值。
于是就想到把对得出的值赋到表[ResumeRecord]的Remark字段,前提是当时的情景没有用到[Remark]这个字段。所以使用其他闲的
字段也可以,字段类型最好与得出的值类型一样,这才是本篇的重点。
select top 15 * from ( select ( case when b.ID IS NULL then '此简历已被该用户删除' else '' end) as Remark, a.ID, a.[Type], a.UserId, a.SubjectId, a.AreaId, a.CompanyId, a.ResumeId, a.SpendType, a.UpdateTime, a.CreatTime, a.AreaPid, a.SubjectPid, a.IsEmailPost, row_number() over (order by a.ID Desc) as r from [ResumeRecord] a left join [Resume] b on a.ResumeId = b.ID where ( type= 2 or type= 1 ) and CompanyId=158732 ) t where t.r>0 order by t.ID Desc
最终搞定。