instr函数是判断在某一个字符串中是否包含指定的字符串
instr返回要截取的字符串在源字符串中的位置
用法1:
select instr('experiment','per') from dual;
此函数返回的是:3
由此可以看出索引是从1开始的(如果查不到就会返回0)
此函数的格式是:instr(sourceString , targetString);
sourceString表示源字符串,targetString表示目标字符串
用法2:
select instr('experiment','e',1,3) from dual;
此函数返回的是8
这种用法中最后的1和3分别代表:
1代表:从第1个字符开始查,
3代表:目标字符出现在源字符的第3次的位置
此函数的格式是;instr(sourceString,targetString,startPosition,numPosition)
startPosition表示:从源字符串的第几个位置开始;
numPosition表示:从目标字符在源字符串的第几次出现;
对比用法1和用法2我们可以看到:startPosition和numPosition是可选参数。
注意:
在使用instr的时候记得要在前后两个字符串中拼接“特定字符”,例如“,”,在我们的项目中就有这样血一样的教训,我们来看例子:
SELECT *
FROM tabel_1 t1, table_2<span style="font-family:Arial, Helvetica, sans-serif;"> t2</span>
WHERE .....--一些条件
and INSTR( t2.ids , t1.id ) > 0
我们这样写的目的是看t1.id在t2.ids中是否存在,我们假定:
t2.ids是一个“123,1234,12345”这样形式的字符串
t1.id为“12”
我们乍一看就认为是:t1.id是在t2.ids中是不存在的
但事实上呢?t1.id在t2.ids中是否存在呢?
答案是存在的,为什么呢?
当你这样写的时候,他就会在“123,1234,12345”中查找有没有“12”这个字符串,很显然有,还不只一处....(“123,1234,12345”)
这样写是不会报错的,但是数据结果呢?差别是非常大的,这样反应给用户的全部都是错误数据,当用户反馈这样的bug的时候,大多数开发人员都是让用户复现,但是这样的错误能复现的了吗?打死你都复现不了,就是时不时的报一个bug。
所以在使用instr的时候切记在两个字符串的前后拼接特殊字符。
针对以上的问题解决方案就是:
SELECT *
FROM tabel_1 t1, table_2<span style="font-family:Arial, Helvetica, sans-serif;"> t2</span>
WHERE .....--一些条件
and INSTR(',' || t2.ids || ',', ',' || t1.id || ',') > 0
这样写的话t2.ids就会变成:“,123,1234,12345,”
t1.id就会变成:“,12,”
这样写的话他就会查“,12,”在“,123,1234,12345,”中是否存在,答案很显然是不存在的。
这样就会达到我们预期的效果。
所以请大家一定要切记在两个字符串的前后拼接特殊字符!!!