MyBatis-Plus中使用order by排序处理null值字段的排序

前提

SQL ORDER BY 子句用于根据一个或者多个字段对查询结果(结果集)进行排序,可以是降序,也可以是升序。
其中 ASC 关键字表示升序,DESC 关键字表示降序;如果不写,数据库默认为 ASC。
当我们使用 order by 对某一字段进行排序时,该字段中包含null值,这种情况下,排序就会出现问题,我们可以根据实际情况,指定为空的排在前面或者排在后面

示例转载自其他博客:博客地址

准备数据

  1. 建表
CREATE TABLE `sys_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户名',
  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '密码',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='用户信息表';
  1. 初始化sql语句
INSERT INTO `test`.`sys_user`(`id`, `username`, `password`, `create_time`, `update_time`) VALUES (1, 'A', 'A', '2022-01-01 00:00:00', '2022-01-01 00:00:00');
INSERT INTO `test`.`sys_user`(`id`, `username`, `password`, `create_time`, `update_time`) VALUES (2, 'B', 'B', '2022-02-01 00:00:00', '2022-02-01 00:00:00');
INSERT INTO `test`.`sys_user`(`id`, `username`, `password`, `create_time`, `update_time`) VALUES (3, 'C', 'C', '2022-03-01 00:00:00', '2022-03-01 00:00:00');
INSERT INTO `test`.`sys_user`(`id`, `username`, `password`, `create_time`, `update_time`) VALUES (4, 'D', 'D', '2022-04-01 00:00:00', NULL);
INSERT INTO `test`.`sys_user`(`id`, `username`, `password`, `create_time`, `update_time`) VALUES (5, 'E', 'E', '2022-05-01 00:00:00', NULL);

示例

sql 排序方式 结果
SELECT id, update_time FROM sys_user; 数据库默认排序 结果一
SELECT id, update_time FROM sys_user ORDER BY update_time ASC; 按照update_time升序, NULL的排到最前 结果二
SELECT id, update_time FROM sys_user ORDER BY IF(isnull(update_time),1,0), update_time ASC; 按照update_time升序, NULL的排到最后 结果三
SELECT id, update_time FROM sys_user ORDER BY update_time DESC; 按照update_time降序, NULL的排到最后 结果四
SELECT id, update_time FROM sys_user ORDER BY IF(isnull(update_time),0,1) ,update_time DESC; 按照update_time降序, NULL的排到最前 结果五

MyBatis-Plus中使用LambdaQueryWrapper处理空值排序

需求:按照时间倒序排序,空的放到最前面

# 改动前,空的放到最后面去了
List<SysUser> sysUsers = userService.list(Wrappers.<SysUser>lambdaQuery()
.orderByDesc(SysUser::getUpdateTime));

# 改动后
List<SysUser> sysUsers = userService.list(Wrappers.<SysUser>lambdaQuery()
.last("ORDER BY IF(isnull(update_time),0,1), update_time DESC"));

建议:非必要不要用为空的字段做排序

posted @ 2023-01-28 14:06  Luke!  阅读(4632)  评论(0编辑  收藏  举报