博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle函数:instr
阅读量:7080 次
发布时间:2019-06-28

本文共 1322 字,大约阅读时间需要 4 分钟。

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 t2 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 t2 WHERE .....--一些条件   and INSTR(',' || t2.ids || ',', ',' || t1.id || ',') > 0
这样写的话t2.ids就会变成:
,
123,1234,12345
,

t1.id就会变成:“,12,

这样写的话他就会查“,12,”在“,123,1234,12345,”中是否存在,答案很显然是不存在的。

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

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

转载地址:http://mxvml.baihongyu.com/

你可能感兴趣的文章
Linux启用ssh服务
查看>>
Centos7 Snapper快照备份
查看>>
cdn
查看>>
每一天的成长由此开始
查看>>
swift开发中如何将时间显示为几分钟前、几小时前、几天前、几个月前
查看>>
某店订单系统水平分库的实践之路以及关键步骤
查看>>
Oracle GoldenGate 快速安装配置实用指南
查看>>
我的友情链接
查看>>
iOS 图片合并 及截图
查看>>
easyui datagrid load 方法键不能为变量的解决
查看>>
分治的一次简单实践
查看>>
博为峰Java面试题-JavaSE I/O之File写入读出
查看>>
USER username (Login failed): Invalid shell: '/bin/false'
查看>>
我的友情链接
查看>>
Linux下整合Apache和Tomcat
查看>>
桌面图标右键选择发送到就会出现卡住假死
查看>>
关于旅行的文章..............搜集
查看>>
关于VLOOUP函数与index match函数
查看>>
Netscaler重置密码的方法
查看>>
MySQL内存设置—— MySQL server has gone away
查看>>