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
强哥,你也该说话了,
强哥,你好好想想,然后不要说话,粗去,表捣乱。
提示。
那么问题来了,之前的数据是按照录入时间进行排序的,即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中的三值逻辑
- 在命令行用 sort 进行排序
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- SQL Server 语句操纵数据库
- SQL(结构化查询语句)
- oracle sql日期比较
- linux快速部署mysql服务器
- sql 存储过程分页
- 文件遍历排序函数
- 在WINXP系统上安装SQL Server企业版的方法
- 通过批处理调用SQL的方法(osql)
- SQL Server 存储过程的分页
- ASP程序与SQL存储过程结合使用详解
- SQL SERVER编写存储过程小工具
- 防御SQL注入攻击时需要注意的一个问题
- Microsoft Sql server2005的安装步骤图文详解及常见问题解决方案