今天解决了一个非常有意思的SQL查询语句的问题,在这里与大家分享一下,并记录以后用到
先了解一下SQL中case的简单用法
--简单CASE函数-CASE某个值WHEN去匹配-THEN符合匹配条件的值-ELSE其他情况-END结束 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --CASE搜索函数-CASE在此处只当开启这一系列的语句固定的结构-WHEN使用条件判断-THEN符合条件判断的值-ELSE其他情况-END结束 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END
首先说说业务场景,在一个数据表中我们存贮了展示在页面的一系列活动,一开始的要求是按照置顶在前和创建时间倒叙排序,最后又添加了举办过的活动自动排到没有举办的后面,经过几番尝试都不行,在试着使用case when语句进行排序的时候成功了,非常高兴,记录下来
--原需求查询语句 select * from activity a order by a.topflag desc,a.createtime desc --新需求查询语句 select * from activity a order by case when a.starttime < now() then 0 else 1 end desc, a.topflag desc,a.createtime desc
语句分析,当活动开始时间小于现在的时间(活动已开始)给0值否则(活动没开始)给1值,然后desc倒序排序,从1到0从活动没开始的到活动已经开始的排序,case when a.starttime < now() then 0 else 1 end这一长串在SQL真正order by的时候已经被替换为0或者1了所以实际上是order by (0|1) desc, a.topflag desc,a.createtime desc