oracle函数:instr

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,”中是否存在,答案很显然是不存在的。

这样就会达到我们预期的效果。

所以请大家一定要切记在两个字符串的前后拼接特殊字符!!!

上一篇:findbugs类介绍(BetterVisitor)


下一篇:linux系统安装IBM WebSphere Application Server(简称WAS)报错:JVM terminated. Exit code=1 ....