SQL 查询中的动态字段过滤

这段代码是一个 SQL 查询中的动态字段过滤部分,使用了 MyBatis 的 标签和 标签。以下是逐步的解释:

java 复制代码
<!-- 动态字段过滤 -->
    <if test="parameters != null and parameters.size() > 0">
        <foreach collection="parameters" item="param" index="index" >
            <if test="param.columnsCode != null and param.searchValue != null">
                AND EXISTS (
                SELECT 1
                FROM JSON_TABLE(
                dynamic_fields,
                '$[*]' COLUMNS (
                columnsCode VARCHAR(255) PATH '$.columnsCode',
                value VARCHAR(255) PATH '$.value'
                )
                ) AS jt
                WHERE jt.columnsCode = #{param.columnsCode}
                AND jt.value LIKE CONCAT('%', #{param.searchValue}, '%')
                )
            </if>
        </foreach>
    </if>

1. 动态字段过滤判断

java 复制代码
<if test="parameters != null and parameters.size() > 0">

这部分检查 parameters 是否为空且大小大于 0,即 parameters

是一个非空的集合。只有在这个条件为真时,后续的过滤逻辑才会执行。

2. 循环遍历 parameters 集合

java 复制代码
<foreach collection="parameters" item="param" index="index">

这部分代码遍历 parameters 集合中的每个元素(每个元素被命名为 param)。 index 是当前遍历元素的索引,param

是当前元素。

3. 动态字段过滤条件判断

java 复制代码
<if test="param.columnsCode != null and param.searchValue != null">

这个 标签判断 param.columnsCode 和 param.searchValue 是否都不为空,只有在这两个字段都不为

null 时,才会应用该条件。

4. 构建查询条件

java 复制代码
AND EXISTS (
    SELECT 1
    FROM JSON_TABLE(
        dynamic_fields,
        '$[*]' COLUMNS (
            columnsCode VARCHAR(255) PATH '$.columnsCode',
            value VARCHAR(255) PATH '$.value'
        )
    ) AS jt
    WHERE jt.columnsCode = #{param.columnsCode}
    AND jt.value LIKE CONCAT('%', #{param.searchValue}, '%')
)
  1. AND EXISTS:这个条件判断是否存在符合特定条件的记录。EXISTS 会检查子查询是否返回结果。

  2. JSON_TABLE:这是MySQL 中的一个函数,用于将 JSON 数据转换成关系型表格形式。这里 dynamic_fields 应该是一个包含 JSON

    数据的列,$[*] 表示遍历 JSON 数组中的每个元素。 columnsCode 和 value:从 JSON 数据中提取字段

  3. columnsCode 和 value,并将其转换为关系型表的列。

  4. WHERE jt.columnsCode = #{param.columnsCode}:匹配 columnsCode 字段的值与传入参数 param.columnsCode 的值相等。

  5. AND jt.value LIKE CONCAT('%', #{param.searchValue}, '%'):使用 LIKE

    模糊查询匹配 value 字段中包含 param.searchValue 的值。

5. 结束标签

java 复制代码
</if>
</foreach>
</if>

这几个 和 标签用于结束前面相应的 if 和 foreach 标签。

6. DynamicSearchParam 类说明

java 复制代码
@Data
public class DynamicSearchParam {
    private String columnsCode;
    private String searchValue;
}

DynamicSearchParam 类是一个包含两个属性的 Java 类:

columnsCode:字段名,用来指定 JSON 数据中的某一列。 searchValue:搜索值,用来匹配 JSON 数据中

columnsCode 对应的字段值。 通过 @Data 注解(Lombok 提供的)自动生成了

getter、setter、toString()、equals()、hashCode() 方法。

7. parameters 列表

java 复制代码
private List<DynamicSearchParam> parameters;

parameters 是一个包含多个 DynamicSearchParam 对象的列表。每个 DynamicSearchParam对象包含了 columnsCode 和 searchValue,这些将被用来动态构建 SQL 查询条件。

总结:

parameters 是一个包含多个 DynamicSearchParam

对象的列表,每个对象指定了要搜索的字段(columnsCode)以及模糊搜索的值(searchValue)。
SQL 中的 会遍历 parameters 列表,为每个 DynamicSearchParam 对象生成一个 EXISTS子查询,查询 JSON 数据中是否包含指定的字段(columnsCode)和符合条件的(searchValue)。
这样可以实现动态过滤,根据不同的 columnsCode 和 searchValue 对 JSON 数据进行查询。

相关推荐
酷ku的森1 分钟前
Redis中的hash数据类型
数据库·redis·哈希算法
Arva .13 分钟前
Redis
数据库·redis·缓存
DemonAvenger13 分钟前
MySQL与应用程序的高效交互模式:从基础到实战的最佳实践
数据库·mysql·性能优化
博一波30 分钟前
Redis 集群:连锁银行的 “多网点智能协作系统”
数据库·redis·缓存
HashData酷克数据36 分钟前
官宣:Apache Cloudberry (Incubating) 2.0.0 发布!
数据库·开源·apache·cloudberry
秋难降36 分钟前
SQL 索引突然 “罢工”?快来看看为什么
数据库·后端·sql
TDengine (老段)1 小时前
TDengine 时间函数 TODAY() 用户手册
大数据·数据库·物联网·oracle·时序数据库·tdengine·涛思数据
码界奇点1 小时前
KingbaseES一体化架构与多层防护体系如何保障企业级数据库的持续稳定与弹性扩展
数据库·架构·可用性测试
悟乙己2 小时前
数据科学家如何更好地展示自己的能力
大数据·数据库·数据科学家
皆过客,揽星河2 小时前
mysql进阶语法(视图)
数据库·sql·mysql·mysql基础语法·mysql进阶语法·视图创建修改删除