SQL中-1,1,2,3四个状态排序为 1,2,3,-1

原创 2016年05月31日 14:50:10

        首先,这个故事从一次项目维护讲起,因之前有很大一批数据显示状态为  失败,即-1。经理觉着不好看,影响客户对系统的第一印象。于是希望把状态为 成功的数据的提前,即1。而2,3在数据库中则分别代表正在建档,语音不够 提示。

那么问题来了,之前的数据是按照录入时间进行排序的,即createDate。首先声明一下,我很懒,所以希望能在不改变太多SQL的情况下去解决这个问题。

经过大概一个小时的头脑风暴之后,我想出来的解决方案是:(该字段为state)

将原先的SQL改为   order by 1/state desc;

其实,我是有些庆幸自己的小聪明,成功地成就了我的懒。

但是事情如果就这样结束的话,也就没有太大意思了。随后我把这个问题发到了我们的撕逼小组“十一度的青春”(之前据说是因为有十一个人,后来发现不够十一个,再后来就不止11个了,反正我们都不是很明白为什么是十一度,可能只是在安抚这帮燥热的少年)。

题目如下:将某一状态可能为-1,1,2,3的数据进行SQL排序为1,2,3,-1。

首先,八哥进行了热情回应:case when + asc  。不过很明显,只是随便那么一想。

随后,我讲出了自己之前的解决方案,他们在“非常礼貌”地吹捧了一番这个想法之后,可能有些被这个小聪明感动,开始了各自的头脑风暴。

强哥首先提出质疑:这个state是“0”的话会报错。当然被排除。

小六给出的方法为  decode(-1,4),其实我自己并不知道这个方法是干嘛用的。

八哥进一步完善了自己的想法: SQL语句有些小问题敬请忽略,看逻辑

  select id,case this when this < 0 then -1 when this > 0 then 1 as index from t order by index desc this asc  ;
并且对小六的想法进行了完善,发现和case when是一个套路,只是写法简单一些:
Select decode (id,1,1,2,2,3,3,-1,4,0) id from t order by id asc;
这时强哥提出问题:用case when 效率低。  
小六的分析结果是:他是上上上下的顺序  怎么乘都不对
可能对这一波的答案,大家都不是很满意。
于是,八哥率先发起了第二波攻势:select id from t order by length(id) asc, id asc ; 负数长度比正数长。
小六随后跟风,这个效率最高。
强哥不服,道:我也想到了一个。 我回复:快说。 于是进入了真空期。
八哥紧跟着进行了第三波攻势:
SELECT id FROM t ORDER BY conv(id,10,2) asc; 把十进制转二进制,负数转之后是1开头,仅该情景可用。
这个时候,我发出了自己由衷的赞叹:这个厉害!666666
强哥,你也该说话了,
强哥,你好好想想,然后不要说话,粗去,表捣乱。



版权声明:本文为博主原创文章,未经博主允许不得转载。

排序使得数组负数在正数左边且按照原来的顺序

假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求分别为:o(n),o(1) 例如     -3 4 2 -...
  • u014053368
  • u014053368
  • 2014年04月07日 18:46
  • 651

sql 多个排序选择,与它的坑

1、场景:当一个查询需要多个排序规则时怎么做? 2、desc 降序,asc 升序,默认升序 3、select * from t_test oreder by createtime ...
  • u014520797
  • u014520797
  • 2017年03月14日 14:09
  • 952

SQL 合并两个结果集 一个倒序,一个正序

要求状态正常的按end_time 升序排, 后面跟着 过期的 数据,按end_time 倒序排 select * from (SELECT * FROM table where status='...
  • ladofwind
  • ladofwind
  • 2015年07月08日 20:33
  • 2843

关于一条sql条件查询+排序 如何加索引最合适

一条sql为: select * from user where gender='1' order by id desc; 加索引方式: 1:为gender添加索引 2:为id添加索引 3:为id和g...
  • zouhao619
  • zouhao619
  • 2014年04月01日 15:04
  • 4462

【sql查询与优化】2.给查询结果排序

注:以下所有sql案例均取自"oracle查询优化改写技巧与案例"丛书。 EMP表的详细: 查询所有信息, SQL> select * from emp;      EMPNO ENAME   ...
  • u013517797
  • u013517797
  • 2016年04月01日 18:01
  • 3312

sql 汉字按照首字母排序博客分类:

SQL mysql   我们的MySQL使用latin1的默认字符集,也就是说,对汉字字段直接使用GBK内码的编码进行存储,当需要对一些有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时...
  • ailsaluo
  • ailsaluo
  • 2014年06月17日 17:23
  • 2819

SQL应用

/* 倒序排序, 空值放最后 */ ORDER BY Column desc nulls last /* 递归查询 */ SELECT * FROM ... WHERE ... START WIT...
  • wzp6010625
  • wzp6010625
  • 2018年01月09日 16:23
  • 34

数据库之SQL ORDER BY 语句用于对结果集进行排序

ORDER BY 语句用于对结果集进行排序。 ORDER BY 语句 ORDER BY 语句用于根据指定的列对结果集进行排序。 ORDER BY 语句默认按照升序对记录进行排...
  • lqhed
  • lqhed
  • 2016年05月24日 18:06
  • 896

sql中order by与索引排序的区别

SQL> conn yang/yang as sysdba 已连接。 SQL> create table t as select object_id id ,object_name name  ...
  • jizhundaa
  • jizhundaa
  • 2015年10月17日 11:46
  • 2531

SQL2012(聚合函数+排序函数)用法介绍

/*************************************** 2012 - Aggregate with order *******************************...
  • roy_88
  • roy_88
  • 2013年12月31日 23:54
  • 2848
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL中-1,1,2,3四个状态排序为 1,2,3,-1
举报原因:
原因补充:

(最多只允许输入30个字)