对应参数描述:
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
‘%周%‘
模糊查询like %%和instr(strSource,strTarget)比较
原文:https://www.cnblogs.com/erma0-007/p/12124106.html