MySQL使用order by column asc排序时,column值存在null,排在最前面

1.前言

最近在使用order by column排序时,本以为很自然的一个排序语句,没想到最后结果却出乎意料,导致没达到想要的排序结果。

MySQL使用order by column asc排序时,column值存在null,排在最前面不知道大家有没有遇到过这种情况哈,就是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);

这时,我们测试表中的数据为:


MySQL使用order by column asc排序时,column值存在null,排在最前面

此时,我们来测试一下排序:

select id,ranking from order_test order by ranking

得到的结果为下图所示:


MySQL使用order by column asc排序时,column值存在null,排在最前面

可以看到,null值排在了最前面,这并不是我们想要的排序结果,我们所期望的是,有值的按照大小顺序排序,null值排在最后面。

3.问题原因

那么为什么会出现这样的现象,经过查询MySQL官方文档,了解到在MySQL中,MySQL将null值视为小于任何非null值。这是参考链接,有兴趣可以进行查阅。

MySQL使用order by column asc排序时,column值存在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;

MySQL使用order by column asc排序时,column值存在null,排在最前面

这时我们可以利用isnull(ranking)对其进行排序,因此可以衍生出我们的解决思路:根据isnull(ranking),ranking进行排序。

select id ,ranking from order_test order by isnull(ranking), ranking;

排序结果


MySQL使用order by column asc排序时,column值存在null,排在最前面

到此,问题顺利解决。


MySQL使用order by column asc排序时,column值存在null,排在最前面


最后,欢迎关注微信公众号一起交流


原文始发于微信公众号(阿喵程序园):MySQL使用order by column asc排序时,column值存在null,排在最前面

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/42835.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!