oracle中实现截取字符串(substr)、查找字符串位置(instr)、替换字符串(replace)

本文介绍了 Oracle 数据库中常见的字符串操作方法,包括 substr 截取字符串、instr 查找字符串位置及 replace 替换字符串的功能与用法,并提供了具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



(1)oracle中实现截取字符串:substr
substr(string, start_position, [length])
其中,string是元字符串,start_position为开始位置,length是可选项,表示子字符串的位数。
例子:
substr('ABCDEFG', 0);    -- 返回结果是:ABCDEFG,从0位开始截取后面所有
substr('ABCDEFG', 2);    -- 返回结果是:CDEFG,从2位开始截取后面所有
substr('ABCDEFG', 0, 3);  -- 返回结果是:ABC,从0位开始往后截取3个字符长度
substr('ABCDEFG', 0, 100);  -- 返回结果是:ABCDEFG,虽然100超出了元字符串长度,但是系统会按元字符串最大数量返回,不会影响返回结果
substr('ABCDEFG', -3);  -- 返回结果是:EFG,如果是负数,则从尾部往前数,截取-3位置往后的所有字符串

(2)查找字符串位置:instr
instr(string, subString, [start_position, [nth_appearance]])
其中,string是元字符串;subString是要查找的子字符串;start_position是要查找的开始位置,为可选项(默认为1),注意在这里字符串索引从1开始,如果此参数为正,则从左到右检索,如果此参数为负,则从右到左检索;nth_appearance是元字符串中第几次出现的子字符串,此参数可选,缺省默认为1,如果是负数则系统报错。

例子:
instr('ABCDABCDAEF', 'AB');   -- 返回结果是:1,因为instr字符串索引从1开始,所以是1不是0
instr('ABCDABCDAEF', 'DA', 1, 2);   -- 返回结果是:8,返回第二次出现'DA'的位置
instr('A BCDABCDAEF', 'DA', 1, 2);  -- 返回结果是:9,由于我在元字符串中加了一个空格,空格仍然算一个字符

(3)替换字符串:replace
replace(str1, str2, str3)
其表示的意思是:在str1中查找str2,凡是出现str2的地方,都替换成str3。
replace('ABCDEFG', 'CDE', 'cde');  -- 返回结果是:ABcdeFG
replace('ABCDEFG', 'CDE', '');   -- 返回结果是:ABFG,CDE被替换成空字符
replace('ABCDEFG', 'CDE');   -- 返回结果是:ABFG,当不存在第三个参数时,CDE直接被删掉

本来我还以为oracle中也有系统自带的那种像split这样的拆分字符串的函数,结果找了好久,发现居然没有,网上有很多解决方法,我就不总结在这里了,后面需要的时候视情况来写。
如果想批量替换修改表中某个字段的某个字符串,可以使用如下的方式:
-- 将description列中的ABC都替换成CBA

UPDATE cux_test t
  SET t.description = REPLACE(t.description, 'ABC', 'CBA')
WHERE t.id = 10063;

注意,上文提到的substr、instr等方法,至于首位是从0开始开始从1开始,上文中可能会存在一些错误,建议在使用的时候首先在数据库中测试一下从0开始从1。

来自:http://yedward.net/?id=62

### Oracle SQL 中截取特殊字符之间的字符串方法 在Oracle数据库中,当需要从字符串中提取位于两个特殊字符之间的子串时,可以组合使用 `SUBSTR` 和 `INSTR` 函数。具体来说: - 使用 `INSTR` 来定位特殊字符的位置。 - 利用这些位置作为边界条件传递给 `SUBSTR` 进行切割。 对于更复杂的场景,可能还需要嵌套多个 `INSTR` 调用来找到连续出现的分隔符索引[^1]。 #### 实际案例解析 假设存在如下表结构及数据样本: | id | path | |----|------------------------------| | 1 | /data_share/webfile/2021/file.txt | 如果目标是从路径字段中抽取年份部分(即 `/2021/` 中间的数值),可以通过以下方式构建查询语句: ```sql SELECT SUBSTR( path, INSTR(path, '/', 1, 3) + 1, -- 定位到第三个斜杠后的第一个字符位置 INSTR(path, '/', 1, 4) - INSTR(path, '/', 1, 3) - 1 -- 计算第四次出现减去第三次出现得到长度 ) AS year_part FROM your_table; ``` 这段代码首先通过两次调用 `INSTR` 找到了第三个和第四个斜杠的具体位置,接着利用这两个坐标计算出所需片段的实际起点与终点范围,并最终由 `SUBSTR` 提取出对应的年度值[^2]。 #### 处理动态数量的分割符情况 面对未知确切次数的分隔符分布模式,则可考虑采用正则表达式的解决方案——借助于 `REGEXP_SUBSTR` 函数。此函数允许指定模式匹配规则从而更加灵活地应对各种复杂情形下的字符串拆解需求。 例如,为了获取文件扩展名之前的一级目录名称(不固定层级深度的情况下),可以用下面的方式编写SQL: ```sql WITH temp AS ( SELECT '/data_share/webfile/2021/12/4e/71/4e7106f91b524c5ba2565b86df3bdbc6.file' as fullpath FROM dual ) SELECT REGEXP_SUBSTR(fullpath,'([^/]+)(?=/.+\..+$)',1,1) dir_name_before_ext FROM temp; ``` 这里运用了前瞻断言 `(=...)` 技巧确保只选取最后一个点号前紧邻的一个非斜线序列作为结果返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值