like "123%" -->走索引
like "%123" -->不走索引
like "%123%" -->不走索引
一般解决方案:
业务尽量避免,或采用搜索引擎
在ibatis或mybatis中,mysql与oracle的like语句不同:
oracle:
一般使用||来拼接字符串,也可用concat,但是concat在oracle中只可连接2个字符串
select * from xxx where
<isNotEmpty prepend="and"property="customerName">
CUSTOMER_NAME like '%'|| #customerName ||'%' </isNotEmpty>
mysql:
一般使用caoncat,concat在mysql中可连接多个字符串
select * from xxx where
<if test="buCode!=null andbuCode!=''">
AND bu_codelike CONCAT('%',#{buCode,jdbcType=VARCHAR},'%')
</if>
需注意的是:
1.oracle也可用CONCAT连接字符串的方式写like sql,但是concat在oracle中只支持拼接2个字符串,如需拼接多个,需自己内外嵌套拼接;
concat有 to_char的作用,就是把其他类型转成varchar类型的
2.||与concat的区别:显然易见,concat在oracle中可知拼接两个字符串,而||可拼接多个
重要:
无论musql还是oracle写like语句都会遇到一个问题:
SELECT * FROM REV_PRICE_BILL WHERE price_name like '%_%';
此sql会查询出所有,price_name的条件无效
解决方案:
SELECT * FROM REV_PRICE_BILL WHERE price_name like '%' || '\_' || '%' ESCAPE '\';
使用ESCAPE定义转义字符,转义字符后的通配符作为普通字符串
ESCAPE使用详细参考:http://blog.csdn.net/david_520042/article/details/6909230