目录
前提
SQL ORDER BY 子句用于根据一个或者多个字段对查询结果(结果集)进行排序,可以是降序,也可以是升序。
其中 ASC 关键字表示升序,DESC 关键字表示降序;如果不写,数据库默认为 ASC。
当我们使用 order by 对某一字段进行排序时,该字段中包含null值,这种情况下,排序就会出现问题,我们可以根据实际情况,指定为空的排在前面或者排在后面
示例转载自其他博客:博客地址
准备数据
- 建表
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='用户信息表';
- 初始化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"));
建议:非必要不要用为空的字段做排序
标签:值字,00,null,NULL,update,sys,time,排序,id From: https://www.cnblogs.com/sudokill/p/16985412.html