添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

背景:查询数据,需要根据不同性别选择不同的排序字段和排序规则,总体先按照性别排列,“女”排在“男”前,然后性别为“男”按照last_name,height,family_name,age进行升序排列,性别为“女”按照family_name,age,height,last_name降序排列,

CREATE TABLE friends (
	id int UNSIGNED not null auto_increment comment '主键',
	family_name VARCHAR(10) COMMENT '姓氏',
	last_name VARCHAR(20) COMMENT '名字',
	sex VARCHAR(2) COMMENT '性别',
	age int COMMENT '年龄',
	height int COMMENT '身高',
	PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='';
INSERT INTO friends(family_name,last_name,sex,age,height) 
	values('wang','li','女',18,50),
	('li','piaoliang','女',19,51),
	('zhang','san','男',18,60),
	('liu','mei','女',17,46),
	('zhao','xiaoman','女',20,49),
	('chen','meng','男',16,55);

(1)mybatis项目:直接使用mybatis的动态SQL即可实现,例如

<select id="getInfo" resultType="java.util.Map">
    select * from friends order by convert(sex USING gbk) desc
    <choose>
        <when test="sex == '女'">
            , family_name, age, height, last_name desc
        </when>
        <when test="sex == '男'">
            , last_name, height, family_name, age desc
        </when>
    </choose>
</select>

(2)如果无法在系统中使用动态SQL,可以在SQL中使用case when then else end语法来实现,不过case when then一般返回一个字段,对于这种多个字段的,可以采用如下方式

select * from friends order by convert(sex USING gbk) desc,
    case when sex = '女' then family_name else last_name end,
    case when sex = '女' then age else height end,
    case when sex = '女' then height else family_name end,
    case when sex = '女' then last_name else age end

查询结果如下:

SQL语句中的convert是为了中文按照拼音排序,可参考:https://blog.csdn.net/yangfengjueqi/article/details/82683688

在一次开发中遇到一个问题,使用case when 去获取到对应的返回值,但是返回值是有多个。比如: test in (case when a='0' then '0' when b = '1' then '0','1' end)--当然这样写是错误的,但是我想返回0和1两个 所以可以换一种思路,既然是用 in 判断,就是存在于结果集就好了,那么可以用 instr来实现。 instr((cas... 需求:有两条相同名字的记录时,按照年龄old字段由大到小排序,如果old也相同,那么按照添加时间time由小到大排序,具体如下: order by case when name=”张三” then old end desc,case when name=”张三” then time end asc; 这里用到的就是case when,它可以多个条件,但是只能返回一个字段,所以要想返回两个字段就 CASE 具有两种格式: 简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。 CASE 搜索函数计算一组布尔表达式以确定结果。 两种格式都支持可选的 ELSE 参数。 语法简单 CASE 函数: 代码如下:CASE input_expression    WHEN when_expression THEN result_expression        [ …n ]    [         ELSE else_result_expression    END 一、case 【列名称】 when【条件】 then 【返回值】... else 【返回值】end1、简单单一条件SELECTCASE o.operate_statusWHEN '1' THEN '暂停'WHEN '2' THEN '启用'WHEN '3' THEN '失效'ELSE '其他' END AS operate_status,o.change_reason,o.creator_name... select sum(case when ismm.smm_type = '1' and ismm .smm_status = '0' then ismm.smm_num else 0 end) as monthPurchaseNum, sum(case when ismm.smm_type = '2' and (ismm.smm_status = '0' or ismm.smm_status = '4') then ismm.smm_num else 0 end) as monthSel. 现在有一个求职招聘的平台,招聘者会发送简历发送的邀请通知,作为求职端有三种返回状态,1.接收简历发送邀请.2.拒绝简历发送邀请,填写拒绝原因(1.距离太远;3.收到信息不做处理,即不接受也不拒绝.需要一个sql查询出需要返回两个字段是否接受简历发送邀请,三种状态1.接收,2.拒绝,3.不做处理;一般情况下casewhen结构,返回的字段只能支持一个,但是会有很多业务场景中需要返回一个以上字段信息.这种问题有两个处理方案,一个是将casewhen结构进行改造,支持返回多个字段;...... 这是最近在使用Oracle数据库时的一个问题,个人认为是一个非常经典的问题。方法一:decode函数 首先想到的方法是使用decode函数判断。 decode(类型, '类型1', '1', '类型2', '2', '其它') 方法二:使用case语句 最后希望文章对你有所帮助,主要讲述了使用DECODE函数和CASE判断多问题,当然如果多个类型也是可以判断并多指输出的,但建议通常判断该两个类型,要么输出A,要么输出B,要么输出A和B。