oracle instr() 和substr()函数

在Oracle中
可以使用instr函数对某个字符串进行判断,判断其是否含有指定的字符。
在一个字符串中查找指定的字符,返回被查找到的指定的字符的位置。
语法:
instr(sourceString,destString,start,appearPosition)

instr('源字符串' , '目标字符串' ,'开始位置','第几次出现')
其中sourceString代表源字符串;
destString代表要从源字符串中查找的子串;
start代表查找的开始位置,这个参数可选的,默认为1;
appearPosition代表想从源字符中查找出第几次出现的destString,这个参数也是可选的, 默认为1
如果start的值为负数,则代表从右往左进行查找,但是位置数据仍然从左向右计算。
返回值为:查找到的字符串的位置。
-------------------------------------------------------------
对于instr函数,我们经常这样使用:从一个字符串中查找指定子串的位置。例如:
SQL> select instr('abcdefgh','de') position from dual;
POSITION
----------
   4
从1开始算 d排第四所以返回4

SQL>select instr('abcdefghbc','bc',3) position from dual;
POSITION
----------
  9
从第3个字符开始算起 第3个字符是c,所以从3开始以后的字符串找查找bc,返回9
---------------------------
从第1个字符开始,查找第2次出现子串的位置
SQL> select instr('qinyinglianqin','qin', 1, 2) position from dual;
POSITION
----------
  12
----------------------------------------------------------------------

SUBSTR()函数  
1.用处:是从给定的字符表达式或备注字段中返回一个子字符串。  
 
2.语法格式:SUBSTR(cExpression,nStartPosition [,nCharactersReturned])   
其中,cExpression指定要从其中返回字符串的字符表达式或备注字段;
nStartPosition用于指定返回的字符串在字符表达式或备注字段中的位置,
nCharactersReturned用于指定返回的字符数目,缺省时返回字符表达式的值结束前的全部字符。  
 
3.举例:STORE'abcdefghijlkm' To mystring   
SUBSTR(mystring ,1,5) 显示 "abcde"  1 从第一个字符开始 截取的字符中,包括第一个字符 
SUBSTR(mystring ,6) 显示 "fghijklm"   
SUBSTR(mystring,-2)显示“km”   最右边一个字符是-1,最右边左边的字符是-2,然后默认是从左向有取剩下的全部的字符
SUBSTR(mystrng,-4)显示“jlkm”

<think>嗯,用户想了解Oracle数据库INSTRSUBSTRNVL2函数的用法示例。首先我需要回忆这三个函数的基本功能,确保自己理解正确。INSTR应该是在字符串中查找子串的位置,SUBSTR用于截取子字符串,而NVL2可能类似于NVL,但处理三个参数,根据第一个参数是否为NULL返回不同的值。 接下来,我需要检查是否有相关的引用资料。用户提供了几个引用,其中引用[1]提到了INSTRSUBSTR||,引用[2]讨论了NVL2,引用[3]关于条件语句,引用[4]是SQL Server的split函数,引用[5]是to_char的示例。需要主要参考引用[1]、[2][5]。 首先处理INSTR函数。根据引用[1],INSTR用于查找子字符串的位置,可能需要说明参数:原字符串、子串、起始位置、出现次数。例如,INSTR('abcde', 'b')返回2。要给出示例,并说明参数的意义,比如第四个参数是第几次出现。 然后是SUBSTR函数,同样在引用[1]中提到,用于截取子串。参数包括原字符串、起始位置、长度。例如,SUBSTR('Hello', 2, 3)返回'ell'。需要注意Oracle的起始位置是1还是0,这里应该是1。 接下来是NVL2函数,引用[2]指出它是Oracle的专用函数,接受三个参数。如果第一个参数非空,返回第二个参数,否则返回第三个。例如,NVL2(NULL, 'A', 'B')返回'B'。需要明确与NVL的区别,NVL是两参数,而NVL2是三参数的。 然后,用户可能需要示例来帮助理解。需要分别给出每个函数的示例SQL语句,例如SELECT INSTR(...) FROM dual,并展示结果。同时,可以结合这些函数使用,比如在SUBSTR中使用INSTR的结果作为起始位置,截取特定部分。 另外,要注意用户提到的格式要求:行内数学表达式用$...$,但这里可能不需要数学公式,主要是代码示例。需要确保代码块用反引号包裹,并标明语言为sql。例如: ```sql SELECT SUBSTR('Oracle', 2, 3) FROM dual; -- 'rac' ``` 还需要检查是否有常见的错误用法需要提醒,比如起始位置为负数时的处理,或者参数为NULL时的行为。例如,SUBSTR的起始位置可以是负数,表示从末尾倒数,但用户可能不熟悉这点,可以提及。 此外,NVL2的参数可以是表达式,不只是字面值,可以举一个实际应用的例子,比如处理表中的字段是否为NULL,返回不同的计算结果或默认值。 最后,生成相关问题时要围绕这三个函数,可能涉及比较其他函数(如NVL),或者实际应用场景,例如字符串分割、处理空值等。确保问题具体且有引导性,帮助用户深入学习。</think>### OracleINSTRSUBSTR、NVL2函数使用说明 #### 1. **INSTR函数** **功能**:在字符串中查找子串的起始位置 **语法**:$ \text{INSTR}(原字符串, 子串, [起始位置], [第n次出现]) $ **示例**: ```sql SELECT INSTR('Hello World', 'o', 1, 2) FROM dual; -- 返回8(从第1位开始,第2次出现'o'的位置) SELECT INSTR('ABCDE', 'CD') FROM dual; -- 返回3 ``` **说明**: - 起始位置默认为1,支持负数(表示从右向左搜索) - 若未找到则返回0[^1] --- #### 2. **SUBSTR函数** **功能**:截取字符串的指定部分 **语法**:$ \text{SUBSTR}(原字符串, 起始位置, [截取长度]) $ **示例**: ```sql SELECT SUBSTR('Oracle Database', 8, 4) FROM dual; -- 返回'Data' SELECT SUBSTR('123456', -3, 2) FROM dual; -- 返回'45'(从倒数第3位取2个字符) ``` **说明**: - 起始位置为负数时表示从右向左计数 - 截取长度省略时默认到字符串末尾[^1] --- #### 3. **NVL2函数** **功能**:根据第一个参数是否为NULL返回不同值 **语法**:$ \text{NVL2}(表达式, 非空返回值, NULL返回值) $ **示例**: ```sql SELECT NVL2(NULL, '存在值', '空值') FROM dual; -- 返回'空值' SELECT NVL2(salary, salary*1.1, 0) FROM employees; -- 工资非空则加薪10%,否则设为0 ``` **说明**: - 与NVL函数不同,NVL2强制要求三个参数[^2] - 返回值类型由第二、三参数中优先级高的类型决定 --- #### 综合应用示例 **场景**:从邮箱地址中提取用户名(@符号前的部分) ```sql SELECT SUBSTR(email, 1, INSTR(email, '@')-1) AS username FROM users WHERE NVL2(email, 1, 0) = 1; -- 排除email为NULL的记录 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值