【技术碎片】【PostgreSQL】Mybatis-Plus多值模糊查询sql语句,order by多个字段排序与优先级

【技术碎片】【PostgreSQL】Mybatis-Plus多值模糊查询sql语句,order by多个字段排序与优先级_第1张图片

目录

  • Mybatis-Plus多值模糊查询sql语句
  • order by多个字段排序与优先级

Mybatis-Plus多值模糊查询sql语句

有数据表如下:

在这里插入图片描述
假设有业务需求需要对查询结果进行多字段排序,比如对id和update_time需要降序排序,并且优先保证id的降序,其次再保证update_time的降序。

我们执行:

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by id, update_time desc
;

有结果如下:

在这里插入图片描述

可以看到id并没有降序排序,并且update_time也没有降序排序。

那是不是字段顺序问题,调转id 和 update_time的顺序查询:

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by update_time, id desc
;

可以发现结果也不对

在这里插入图片描述

可以发现,如果使用语句

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by update_time, id desc
;

则实际上是将查询结果按照update_time做升序,再对id做降序,并且以update_time升序为优先,也就是说desc只对它修饰的id字段生效,所以如果对多个字段排序,需要多次使用desc/asc来修饰多个字段,正确解决需求的语句如下:

SELECT id, username, passwd, enabled, account_non_expired, account_non_locked, credentials_non_expired, is_deleted, create_time, create_user, update_time, update_user
FROM test.image_management_user
order by id desc, update_time desc
;

结果为:
在这里插入图片描述

可以看到查询结果以id降序为有限,其次保证update_time的降序。

order by多个字段排序与优先级

有时候需要多个值在单个字段上进行模糊查询,比如对用户名user_name 字段中搜索包含,或,或的用户名,mysql中有

SELECT * FROM public.table WHERE user_name REGEXP '张|李|赵';

假设通过List传到后端,请求体对象为input,则利用mybatis-plus我们可以实现多值模糊查询sql语句:


        // 多值模糊查询sql语句
        List keyWords = input.getKeyWords();
        String sql = "user_name REGEXP ";
        if (!CollectionUtil.isEmpty(keyWords)) {
            StringBuilder sqlBuilder = new StringBuilder();
            sqlBuilder.append("'");
            for (String keyWord : keyWords) {
                sqlBuilder.append(keyWord).append("|");
            }
            sqlBuilder.deleteCharAt(sqlBuilder.length() - 1).append("'");;
            sql += sqlBuilder.toString();
        }

        // 数据库分页查询 - apply将sql语句应用
        Page selectOutputPage = userInfoMapper.selectPage(
                new Page<>(input.getPageNo(), input.getPageSize()),
                Wrappers.lambdaQuery(User.class)
                .eq(User::getIsDeleted, Boolean.FALSE)
                .in(!input.getUserTypes().isEmpty(), User::getUserType, input.getUserTypes())
                .apply(sql)
        );
        

你可能感兴趣的:(#,技术碎片,数据库,项目,mybatis,sql,postgresql,java,后端)