倚楼听风雨
淡看江湖路

MySQL order by 如何实现像 PgSQL 的 nulls last?

最近在写 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』效果。

示例:

如上所示的 sql,如果字段 id 存在 null 值并且我们要在排序的时候过滤掉这些 null 值,使用「minus-before-column-name」的方法,sql 就是下面的样子:

注意看一下区别,在索要排序 order by 的列名前要加上减号「-」,并且对应的 asc 要变成 desc,值的一提的事情,这个解决方案在 MySQL 的官方文档中似乎并没有提及到。

二、ISNULL 函数

通过使用 ISNULL 函数也可以实现「nulls last」效果,而且这样无需像第一种方法需要将排序倒置(一不小心可能就理解错了,本来升序的看起来像是降序的)。示例 sql:

你也可以这样写:

注意

以上这样的方式对于聚合之后的别名字段不生效,只对数据库中的直接字段使用有效。

相关文章阅读

  1. MySQL Orderby a number, Nulls last
  2. Comparison of different SQL implementations
  3. MySQL 各种函数使用方法存档 持续更新
  4. MySQL 索引知识详细总结

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可以加入本站封闭式交流论坛「DownHub」开启新世界的大门,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。

赞(3) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » MySQL order by 如何实现像 PgSQL 的 nulls last?

开始你的表演 抢沙发

觉得文章有用就打赏一下老四,鼓励我更好的创作

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册