最近在写 MySQL 语句的时候,使用 order by 对表中的某个字段进行排序,但是改字段存在一些为空的值,在业务终端进行显示的时候,产品业务逻辑要求对空值不进行排序。此前在使用 PgSQL 的过程中,可以直接使用 order by xx asc/desc nulls last 对空值进行直接过滤,实现对「xx」字段有值的行进行排序操作,但是在 MySQL 中发现这样不行。
在 MySQL 中其实要解决这样的问题,方案有两种:
一、minus-before-column-name
讲人话就是「NULL 被认为低于任何非 NULL 值,除非在列名之前添加(减号 -)字符并且 ASC 更改为 DESC,或 DESC 更改为 ASC;」,这样就能实现像 PgSQL 的『nulls last』效果。
示例:
1 |
select * from table_glorze order by id asc; |
如上所示的 sql,如果字段 id 存在 null 值并且我们要在排序的时候过滤掉这些 null 值,使用「minus-before-column-name」的方法,sql 就是下面的样子:
1 |
select * from table_glorze order by -id desc; |
注意看一下区别,在索要排序 order by 的列名前要加上减号「-」,并且对应的 asc 要变成 desc,值的一提的事情,这个解决方案在 MySQL 的官方文档中似乎并没有提及到。
二、ISNULL 函数
通过使用 ISNULL 函数也可以实现「nulls last」效果,而且这样无需像第一种方法需要将排序倒置(一不小心可能就理解错了,本来升序的看起来像是降序的)。示例 sql:
1 |
select * from table_glorze order by ISNULL(id), id asc; |
你也可以这样写:
1 |
select * from table_glorze order by id IS NULL, id ASC |
注意
以上这样的方式对于聚合之后的别名字段不生效,只对数据库中的直接字段使用有效。
相关文章阅读
- 《MySQL Orderby a number, Nulls last》
- 《Comparison of different SQL implementations》
- 《MySQL 各种函数使用方法存档 持续更新》
- 《MySQL 索引知识详细总结》
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可以加入本站封闭式交流论坛「DownHub」开启新世界的大门,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。