前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试452】函数SUBSTR和INSTR有什么区别?

【DB笔试面试452】函数SUBSTR和INSTR有什么区别?

作者头像
AiDBA宝典
发布2019-09-30 17:22:16
8820
发布2019-09-30 17:22:16
举报
文章被收录于专栏:小麦苗的DB宝专栏

题目部分

函数SUBSTR和INSTR有什么区别?

答案部分

SUBSTR和INSTR都是字符函数,SUBSTR是截取子串,而INSTR的作用是获取指定字符的位置。

1、SUBSTR:截取子串

下标从1开始,这个函数有三个参数,第一个参数为目标字符串,第二个参数是将要输出的子串的起点,第三个参数是将要输出的子串的长度,如果没有第三个参数,那么余下的字符全部输出。如果第二个参数为负数,那么将会从目标字符串的尾部开始向前定位至负数的绝对值的位置。下面给出一个例子:

代码语言:javascript
复制
SYS@raclhr1> SELECT SUBSTR('lihuarong',0,3) col_1,
  2              SUBSTR('lihuarong',1,3)col_2,
  3              SUBSTR('lihuarong',3)col_3,
  4              SUBSTR('lihuarong',-4,3) col_4
  5  FROM DUAL;
COL COL COL_3   COL
--- --- ------- ---
lih lih huarong ron

2、INSTR:相当于STRING类中的INDEXOF,求索引

如果需要知道在一个字符串中满足特定的内容的子串位置,那么可以使用INSTR,它的第一个参数是目标字符串,第二个参数是匹配的内容,第三和第四个参数是数字,用以指定开始搜索的起点以及指出第几个满足条件的将会被返回。默认第三个与第四个参数的数值均为1,如果第三个数值为负数,那么将会从后向前搜索。如果未匹配到,那么返回0。需要注意的是,无论是从前向后还是从后向前搜索,返回的数值都是从左到右的数值。

代码语言:javascript
复制
SYS@raclhr1> SELECT INSTR('HelloWHoldhH', 'H', 6, 2) l1, --从第6个位置开始,第2次出现H的位置
  2         INSTR('HelloWHoldhH', 'H') l2, --从第1个位置开始,第1次出现H的位置
  3         INSTR('HelloWHoldhH', 'H', 2) l3, --从第2个位置开始,第1次出现H的位置
  4         INSTR('HelloWHoldhH', 'H', -1) l4, --从倒数第1个位置开始从右往左搜索,第1次出现H的位置
  5         INSTR('HelloWHoldhH','/')  l5--从第1个位置开始,第1次出现H的位置,如果匹配不到那么返回0
  6  FROM   DUAL;
        L1         L2         L3         L4         L5
---------- ---------- ---------- ---------- ----------
        12          1          7         12          0

3、INSTR的特殊用法

下面的2条SQL语句的功能是一样的:

代码语言:javascript
复制
SELECT * FROM DBA_OBJECTS D WHERE  INSTR('5,6,7', D.OBJECT_ID) > 0;
SELECT * FROM DBA_OBJECTS D WHERE D.OBJECT_ID=5 OR D.OBJECT_ID=6 OR D.OBJECT_ID=7;

其结果为:

代码语言:javascript
复制
SQL> SELECT D.OBJECT_ID FROM DBA_OBJECTS D WHERE  INSTR('5,6,7',D.OBJECT_ID) > 0;
 OBJECT_ID
----------
         7
         6
         5

4、SUBSTR和INSTR的联合使用

SUBSTR和INSTR这2个函数常常关联使用,但是如果INSTR匹配不到字符串的话,那么返回的就是0,这样SUBSTR得到的值就是空值,所以,这个时候就应该进行转换,使用DECODE或其它函数来转化。下面给出一个例子:

代码语言:javascript
复制
SELECT NAME,
       SUBSTR(NAME, 1, INSTR(NAME, 'a') - 1),
       DECODE(INSTR(NAME, 'a'),0, NAME,SUBSTR(NAME, 1, INSTR(NAME, 'a') - 1))
FROM   XB_B;

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

About Me:小麦苗

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档