首先,这个故事从一次项目维护讲起,因之前有很大一批数据显示状态为 失败,即-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语句有些小问题敬请忽略,看逻辑)