您的位置:首页 > 数据库

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

2016-05-31 14:50 267 查看
        首先,这个故事从一次项目维护讲起,因之前有很大一批数据显示状态为  失败,即-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

强哥,你也该说话了,



强哥,你好好想想,然后不要说话,粗去,表捣乱。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SQL 排序