如何通过NULLS LAST语法巧妙解决SQL窗口函数中NULL值排序难题?
- 内容介绍
- 相关推荐
本文共计855个文字,预计阅读时间需要4分钟。
SQL窗口函数(如 ROW_NUMBER()、RANK()、LEAD())的排序行完全依赖于 ORDER BY 子句。大多数数据库(如PostgreSQL、Oracle、SQL Server)默认将 NULL 当作最小值,排在非空值之前;但MySQL 8.0+ 默认将 NULL 当作最大值。这种不一致性会导致相同窗口逻辑在不同环境产生不同结果。
典型现象:按 updated_at 降序取最新记录时,含 NULL 的行意外排第一,ROW_NUMBER() OVER (ORDER BY updated_at DESC) 把 NULL 行标为 1,业务误判为“最新”。
本文共计855个文字,预计阅读时间需要4分钟。
SQL窗口函数(如 ROW_NUMBER()、RANK()、LEAD())的排序行完全依赖于 ORDER BY 子句。大多数数据库(如PostgreSQL、Oracle、SQL Server)默认将 NULL 当作最小值,排在非空值之前;但MySQL 8.0+ 默认将 NULL 当作最大值。这种不一致性会导致相同窗口逻辑在不同环境产生不同结果。
典型现象:按 updated_at 降序取最新记录时,含 NULL 的行意外排第一,ROW_NUMBER() OVER (ORDER BY updated_at DESC) 把 NULL 行标为 1,业务误判为“最新”。

