instr模糊查询使用及注意事项

对应参数描述: 
instr('源字符串' , '目标字符串' ,'开始位置','第几次出现'),返回目标字符串在源字符串中的位置。后面两个参数可要可不要。
 

​instr('源字符串' , '目标字符串' ), 从开头开始查找第一个‘ 目标字符串 ’出现的位置 

1.结尾,网上有说这么写的,但是在orcle下没有问题,在mysql中是有问题的。
查询最后一个
SELECT * FROM 用户.表 WHERE INSTR(字段名, ‘杰 ’) = LENGTH(字段名)
SELECT * FROM 用户.表 WHERE 字段名 LIKE '%杰 ‘;
 
查询最后两个
SELECT * FROM 用户.表 WHERE INSTR(字段名, ‘邱天’) = LENGTH(字段名)-1
SELECT * FROM 用户.表 WHERE 字段名 LIKE '%邱天‘;
上面两个是相等的,不过第一个效率高 。

实际执行结果:
SELECT * 
FROM d_ebc_member 
WHERE 
INSTR(member_name,'杰') = (LENGTH(member_name));
 

换个SQl执行: 
 
SELECT * 
FROM d_ebc_member 
WHERE 
INSTR(member_name,'杰') = (LENGTH(member_name)-6);
 

按这个查询在mysql里面是有问题的: 
第一:LENGTH()函数在mysql中取字节,因此每个汉子字要按三个字节计算。 
第二:instr取的是位置。 
SELECT * FROM 用户.表 WHERE INSTR(字段名, ‘杰’,-1,1) = LENGTH(字段名) 
我觉得前半部分需要加上位置参数,才是表示从倒数第一个位置开始,第一次出现的位置, 
加上后报错如下: 
incorrect parameter count in the call to native function 'instr' 
这是由于mysql和Orcle的不同造成的。
 
结论:
末尾查询使用使用like或者其他,用instr无法实现末尾查询
 
2.包含
SELECT * 
FROM d_ebc_member 
WHERE 
INSTR(member_name,'杰') > 0; 
 
SELECT * FROM 用户.表 WHERE 字段名 LIKE '%杰 %‘;
 
3.开头
SELECT * 
FROM d_ebc_member 
WHERE 
INSTR(member_name,'周') = 1; 
 
SELECT * FROM 用户.表 WHERE 字段名 LIKE ‘周 %’;

4.not like
SELECT * 
FROM d_ebc_member 
WHERE 
INSTR(member_name,'周') = 0; 

SELECT * FROM 用户.表 WHERE 字段名 not LIKE ‘%周%’;
 
SELECT * 
FROM d_ebc_member 
WHERE 
member_name 
NOT LIKE
'%周%'
原文地址:https://www.cnblogs.com/erma0-007/p/12124106.html