一般我们实现模糊查询功能都是通过MySQL的LIKE关键字配合通配符进行实现的,但当关键字需要进行多字段匹配的时候则比较麻烦,常规写法如下,每个需要匹配到的字段使用OR关键字连接进行匹配。但是所需要匹配字段多时这种写法过于冗长
常规写法:
<select id="findByKeyWord" resultType="example.modules.entity.Demo">
SELECT <include refid="Base_Column_List"/> FROM table
<where>
<if test="keyword!=null and keyword!=''">
AND ( name_zh LIKE CONCAT('%',#{keyword},'%') OR name_en LIKE CONCAT('%',#{keyword},'%') )
</if>
</where>
</select>
改造写法:
这种写法使用了CONCAT拼接了需要匹配的字段,但是当其中一个字段里面有null值的时候是不能够匹配到的,因此还需要进行判空操作
<select id="findByKeyWord" resultType="example.modules.entity.Demo">
SELECT <include refid="Base_Column_List"/> FROM table
<where>
<if test="keyword!=null and keyword!=''">
AND CONCAT( name_zh,name_en ) LIKE concat('%',#{keyword},'%')
</if>
</where>
</select>
改良写法
使用IFNULL()对字段进行判空,如果为null则使用空字符串替换
<select id="findByKeyWord" resultType="example.modules.entity.Demo">
SELECT <include refid="Base_Column_List"/> FROM table
<where>
<if test="keyword!=null and keyword!=''">
AND CONCAT(IFNULL(name_zh,''),IFNULL(name_en,'')) LIKE concat('%',#{keyword},'%')
</if>
</where>
</select>