相关文章推荐
酒量小的小刀  ·  Mysql Grant ...·  2 年前    · 
空虚的显示器  ·  Flutter教程 — ...·  2 年前    · 

一般情况下case when结构,返回的字段只能支持一个,但是会有很多业务场景中需要返回一个以上字段信息.这种问题有两个处理方案,一个是将case when结构进行改造,支持返回多个字段;另一种就是保持case when返回字段个数不变(只返回一个字段),修改业务逻辑,在service中按照case when返回一个字段进行处理.本文主要介绍第一种处理方案.下面结合一个业务场景说明如何进行处理.

业务问题场景描述

现在有一个求职招聘的平台,招聘者会发送简历发送的邀请通知,作为求职端有三种返回状态,1.接收简历发送邀请.2.拒绝简历发送邀请,填写拒绝原因(1.距离太远;2.已找到工作;3.其他);3.收到信息不做处理,即不接受也不拒绝.需要一个sql查询出需要返回两个字段:是否接受简历发送邀请,三种状态:1.接收,2.拒绝,3.不做处理;拒绝状态:0.无拒绝处理;1.距离太远;2.已找到工作;3.其他.只有当求职者拒绝简历发送时拒绝状态才会从1-3中进行取值,接收简历发送邀请或是不做处理时此状态需要返回0.
业务表简要说明:job_send_post为求职者简历投递记录表,只要是求职者发送过简历都会从此表中添加记录;job_news为求职者发送给招聘者的消息记录表.

case when只允许返回一个字段,原来的不支持就只能自己"新增字段",所以可以使用concat函数进行拼接,此种拼接可以支持拼接多个字段.总结的写法如下:

CASE WHEN 
THEN CONCAT(字段1,'+',字段2'+',字段3......)
ELSE CONCAT(字段1,'+',字段2'+',字段3......)
-- 查询招聘端消息记录中求职端是否发送过拒绝简历消息以及拒绝类型,如果没有发送则简历邀请状态为3,拒绝状态为0.如果有则简历邀请状态为2,拒绝原因使用查询出来的refuse_type拒绝类型
IFNULL((SELECT CONCAT(2,"+",refuse_type) FROM job_news WHERE user_id='rxkyogtktutm4pbsi18e' ),CONCAT(3,'+',0))

END) receive_state
    这个场景中就是需要将是否接受邀请字段与拒绝状态字段进行拼接,注意字段中间需要使用一个特殊字符进行拼接,方便service层进行截取.具体执行如下:

	SELECT 
(CASE WHEN 
-- 判断user_id为rxkyogtktutm4pbsi18e的求职者是否给招聘端投递过简历记录,如果投递过则说明接受过招聘端的简历邀请,简历邀请状态为1,拒绝状态为0
 IF((SELECT 1 FROM job_send_post WHERE user_id='rxkyogtktutm4pbsi18e' LIMIT 1)=1,TRUE,FALSE)
	CONCAT(1,'+',0)
	-- 查询招聘端消息记录中求职端是否发送过拒绝简历消息以及拒绝类型,如果没有发送则简历邀请状态为3,拒绝状态为0.如果有则简历邀请状态为2,拒绝原因使用查询出来的refuse_type拒绝类型
	IFNULL((SELECT CONCAT(2,"+",refuse_type) FROM job_news WHERE user_id='rxkyogtktutm4pbsi18e' ),CONCAT(3,'+',0))
END) receive_state

    以上是处理问题过程,如有帮助,欢迎点赞或留言!

现在有一个求职招聘的平台,招聘者会发送简历发送的邀请通知,作为求职端有三种返回状态,1.接收简历发送邀请.2.拒绝简历发送邀请,填写拒绝原因(1.距离太远;3.收到信息不做处理,即不接受也不拒绝.需要一个sql查询出需要返回两个字段是否接受简历发送邀请,三种状态1.接收,2.拒绝,3.不做处理;一般情况下casewhen结构,返回的字段只能支持一个,但是会有很多业务场景中需要返回一个以上字段信息.这种问题有两个处理方案,一个是将casewhen结构进行改造,支持返回多个字段;......
举例如下: 数据表为DemoTable,字段有id, condition1,condition2,condition3,condition4,condition5 要求是查询DemoTable,condition1,condition2,condition3,condition4,condition5五个字段符合任意两个或两个以上的条件的内容。 可使用case when来实现这个条件,需要嵌套子查询语句 sql语句代码示例如下: 代码如下: SELECT * FROM DemoTable WHERE ((SELECT CASE 1 WHEN condition1满足条件 THEN 1 E
背景:查询数据,需要根据不同性别选择不同的排序字段和排序规则,总体先按照性别排列,“女”排在“男”前,然后性别为“男”按照last_name,height,family_name,age进行升序排列,性别为“女”按照family_name,age,height,last_name降序排列, CREATE TABLE friends ( id int UNSIGNED not null aut...
Oracle数据库开发CASE...THEN子句有时需要返回多个值用于判断,如何做才能在CASE...THEN表达式返回多个值呢,具体参考下面的演示: SQL> select case 2 when to_char(sysdate, 'SS') > 30 then sys.odcivarchar2list('Sent') 3 else sys.
在一次开发遇到一个问题,使用case when 去获取到对应的返回值,但是返回值是有多个。比如: test in (case when a='0' then '0' when b = '1' then '0','1' end)--当然这样写是错误的,但是我想返回0和1两个值 所以可以换一种思路,既然是用 in 判断,就是存在于结果集就好了,那么可以用 instr来实现。 instr((cas...
select COUNT(distinct case when p.lab like '%L%' then (case when p.bar_code like '%T%' then p.bar_code else null end) else null end ) countBarCode from t_plan p 说明:在case when的then位置嵌套case when,能够实现两个条件对某一个字段的过滤。 上面的例子是首先根据lab字
需求:有两条相同名字的记录时,按照年龄old字段由大到小排序,如果old也相同,那么按照添加时间time由小到大排序,具体如下: order by case when name=”张三” then old end desc,case when name=”张三” then time end asc; 这里用到的就是case when,它可以多个条件,但是只能返回一个字段,所以要想返回两个字段
1、array_column(array$input,mixed$column_key[,mixed$index_key= null] ) :array 返回多维数组指定的一列 ,如果指定了可选参数index_key,那么input数组的这一列的值将作为返回数组对应值的键。 input:需要取出数组列的多维数组(或结果集) column_key:需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键。 也可以是 NULL ,此时将返回整个数组(配合 i...
MySQL 的 `CASE WHEN` 语句用于实现类似于条件语句(if-then-else)的功能,可以在查询字段的值进行判断并返回不同的结果。语法如下: WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE result 其,`condition1`, `condition2`, ... 分别表示需要判断的条件,`result1`, `result2`, ... 分别表示当条件成立时的结果,`ELSE result` 表示所有条件都不成立时的结果。 举个例子: SELECT id, name, WHEN score >= 90 THEN 'A' WHEN score >= 80 THEN 'B' ELSE 'C' END AS grade FROM students; 上面的语句,对学生的成绩进行了判断,将其分为 A、B 或 C 等级。