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 数据进行查询。

相关推荐
程序员敲代码吗11 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
未来的旋律~12 小时前
sqlilabs注入靶场搭建与sql语句
数据库·sql
一个天蝎座 白勺 程序猿12 小时前
KingbaseES查询逻辑优化深度解析:从子查询到语义优化的全链路实践
开发语言·数据库·kingbasees·金仓数据库
我真的是大笨蛋12 小时前
InnoDB行级锁解析
java·数据库·sql·mysql·性能优化·数据库开发
山茶花.13 小时前
SQL注入总结
数据库·sql·oracle
m0_7369191014 小时前
超越Python:下一步该学什么编程语言?
jvm·数据库·python
m0_7482299914 小时前
ThinkPHP快速入门:从零到实战
c语言·开发语言·数据库·学习
阿蒙Amon14 小时前
C#每日面试题-Thread.Sleep和Task.Delay的区别
java·数据库·c#
沉舟侧畔千帆过_14 小时前
一个DBA的真心话:搞定Oracle+PG双库,我就靠这招
数据库·oracle·dba
醉风塘14 小时前
【终极解决方案】Oracle ORA-01795错误:IN列表1000条限制的全面突破指南
数据库·oracle