1.前言
最近在使用order by column排序时,本以为很自然的一个排序语句,没想到最后结果却出乎意料,导致没达到想要的排序结果。
不知道大家有没有遇到过这种情况哈,就是order by column,但是column中存在null值,这时候null会被排在最前面,然后才是根据column值的大小排序。下面我们来复现一下这种情况。
2.出现场景
create table order_test(
id bigint primary key auto_increment comment '主键',
ranking int comment '排名'
);
insert into order_test(ranking) values (null),(2),(3),(null),(1);
这时,我们测试表中的数据为:
此时,我们来测试一下排序:
select id,ranking from order_test order by ranking
得到的结果为下图所示:
可以看到,null值排在了最前面,这并不是我们想要的排序结果,我们所期望的是,有值的按照大小顺序排序,null值排在最后面。
3.问题原因
那么为什么会出现这样的现象,经过查询MySQL官方文档,了解到在MySQL中,MySQL将null值视为小于任何非null值。这是
参考链接
,有兴趣可以进行查阅。
4.解决方案
我们可以利用isnull(expr)函数的特性,If expr is NULL, ISNULL() returns 1, otherwise it returns 0。如果表达式的值为null则返回为1,否则返回0。
select isnull(ranking), id ,ranking from order_test;
这时我们可以利用isnull(ranking)对其进行排序,因此可以衍生出我们的解决思路:根据
isnull(ranking),ranking
进行排序。
select id ,ranking from order_test order by isnull(ranking), ranking;
排序结果
:
到此,问题顺利解决。
欢迎大家一起交流学习。
最后,欢迎关注微信公众号一起交流