关于用一个表的字段对另一个表模糊查询的问题

一,问题描述

今天做项目的时候遇到了一个需求,就是按照客户的名字模糊查询合同表。然后看了一下合同表,里面并没有客户名这个字段,有的是一个客户id,所有关于客户的东西都是通过它连表查询出来的,作为一个新手,这显然对我有一定的困难。

二,解决

最终我的解决思路就是——子查询,用in做判断条件。直接上代码:

<select id="selectEsContractList" parameterType="EsContract" resultMap="EsContractResult">
        <include refid="selectEsContractVo"/>
        <where>
            <if test="customer != null ">
                and customer_id in (select id from es_customers where name like concat('%', #{customer}, '%'))
            </if>
            <if test="itemId != null  and itemId != ''"> and c.item_id = #{itemId}</if>
            <if test="buildId != null "> and c.build_id = #{buildId}</if>
            <if test="unitId != null "> and c.unit_id = #{unitId}</if>
            <if test="doorId != null "> and c.door_id = #{doorId}</if>
            <if test="payphase != null  and payphase != ''"> and payphase = #{payphase}</if>
            <if test="deptId != null "> and c.dept_id = #{deptId}</if>
            <if test="userId != null "> and c.user_id = #{userId}</if>
            <if test="userId != null "> and c.channel_id = #{channelId}</if>
        </where>
</select>

这就是那一部分的代码,当传来的customer(客户名)不为空时,if里面的sql语句就会生效,

select id from es_customers where name like concat('%', #{customer}, '%')就会查出所有符合条件的客户(只查了id),当合同表中的记录的customer_id字段在(in)这个查询结果中,就会被查出来。

postman测试,数据因为懒所以只有一个客户, 但从他们合同id不一样可以看出来是正确的。

要将一个的模糊字段一个字段关联,通常需要使用SQL语句中的JOIN操作来实现。这里提供一个基于SQL的通用方法,以实现两个之间的关联查询,尤其适用于字段值不完全匹配的情况: 1. 使用LIKE操作符进行模糊匹配。如果你想要关联的字段一个文本字段,并且你希望基于某个模式进行匹配,可以在WHERE子句中使用LIKE操作符。 ```sql SELECT * FROM Table1 JOIN Table2 ON Table1.FuzzyColumn LIKE CONCAT('%', Table2.ExactColumn, '%'); ``` 在这个例子中,`Table1.FuzzyColumn`是含有模糊数据的字段,而`Table2.ExactColumn`是一个中你想要匹配的精确值字段。CONCAT函数用于构造包含通配符的LIKE查询,`%`是SQL中的通配符,示任意字符串。 2. 使用正则达式。在某些数据库系统中,如MySQL,你可以使用REGEXP或者RLIKE操作符来进行正则达式匹配,以实现更复杂的模糊匹配。 ```sql SELECT * FROM Table1 JOIN Table2 ON Table1.FuzzyColumn REGEXP CONCAT('.*', Table2.ExactColumn, '.*'); ``` 这个例子使用了正则达式来实现模糊匹配,其中`.*`示任意数量的任意字符。 3. 使用全文搜索。如果涉及的是大量文本数据的匹配,一些数据库系统提供了全文搜索功能,如MySQL的FULLTEXT索引或PostgreSQL的全文搜索功能,它们可以提高对文本字段的搜索效率。 ```sql SELECT * FROM Table1 INNER JOIN Table2 ON MATCH(Table1.FuzzyColumn) AGAINST('+word' IN BOOLEAN MODE); ``` 在这个例子中,`MATCH()`和`AGAINST()`函数用于执行全文搜索。 请注意,上述方法在不同的数据库系统中可能会有所不同,需要根据你使用的具体数据库系统语法进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值