使用oracle的substr和instr更新字段的部分字符串

文章展示了如何使用SQL的select语句进行字符串处理,如查找子串位置和截取子串,以及如何用这些信息来更新数据库中的记录,特别是与URL路径相关的数据。

 select instr('http://10.0.250.104:8078/luxiliangmixian/invoke','/luxiliangmixian') from dual;--25
     select substr('http://10.0.250.104:8078/luxiliangmixian/invoke',instr('http://10.0.250.104:8078/luxiliangmixian/invoke','/luxiliangmixian')) from dual;--/luxiliangmixian/invoke
     update ATTRIBUTEVALUEEN a set a.attributevaluestr = 'http://10.0.250.104:8078'||substr(a.attributevaluestr,instr(a.attributevaluestr,'/luxiliangmixian'))  where a.attributevaluestr like '%luxiliangmixian/invoke%';
       

### 使用INSTRSUBSTR函数进行复杂字符串处理 在Oracle SQL中,`SUBSTR` `INSTR` 函数可以结合使用,以实现对字符串的复杂截取与解析操作。`SUBSTR` 用于从指定位置开始截取一定长度的子字符串,而 `INSTR` 则用于查找特定字符或子串在字符串中的位置[^1]。 #### 提取两个分隔符之间的内容 当需要提取字符串中两个特定分隔符之间的内容时,可以通过嵌套使用 `INSTR` 来确定起始结束位置,再使用 `SUBSTR` 进行截取。例如,对于字符串 `'da.bai.cai'`,若要提取第一个点(`.`)第二个点之间的内容: ```sql SELECT SUBSTR('da.bai.cai', INSTR('da.bai.cai', '.', 1, 1) + 1, INSTR('da.bai.cai', '.', 1, 2) - INSTR('da.bai.cai', '.', 1, 1) - 1) AS result FROM DUAL; ``` 此查询的结果为 `'bai'`,其中 `INSTR` 用于定位两个点的位置,`SUBSTR` 则根据这些位置提取中间的内容[^4]。 #### 提取最后一个分隔符之后的内容 若需提取字符串中最后一个分隔符后的内容,可利用负数作为 `INSTR` 的搜索方向参数,表示从右向左查找。例如,从 `'da.bai.cai'` 中提取最后一个点之后的内容: ```sql SELECT SUBSTR('da.bai.cai', INSTR('da.bai.cai', '.', -1) + 1) AS result FROM DUAL; ``` 该查询返回 `'cai'`,通过从右往左查找最后一个点的位置,并从其后一位开始截取至字符串末尾。 #### 动态截取多个字段 在面对多个分隔符且不确定具体数量的情况下,可以结合 `CONNECT BY` 子句与 `LEVEL` 伪列来动态提取每个字段。这种方法常用于模拟类似其他编程语言中的 `split` 函数功能: ```sql SELECT LEVEL AS position, SUBSTR('da.bai.cai', INSTR('da.bai.cai', '.', 1, LEVEL - 1) + 1, INSTR('da.bai.cai', '.', 1, LEVEL) - INSTR('da.bai.cai', '.', 1, LEVEL - 1) - 1) AS part FROM DUAL CONNECT BY LEVEL <= LENGTH('da.bai.cai') - LENGTH(REPLACE('da.bai.cai', '.', '')) + 1; ``` 此查询将返回 `'da'`、`'bai'` `'cai'`,分别对应字符串中由点分隔的三个部分。通过 `LEVEL` 控制每次提取的位置,并计算出每个字段的长度。 #### 替换特定子串 虽然 `SUBSTR` 本身不支持替换操作,但可以通过组合 `SUBSTR`、`INSTR` `CONCAT` 或 `||` 操作符实现字符串部分替换。例如,将 `'Hello World'` 中的 `'World'` 替换为 `'SQL'`: ```sql SELECT SUBSTR('Hello World', 1, INSTR('Hello World', 'World') - 1) || 'SQL' AS result FROM DUAL; ``` 该查询返回 `'Hello SQL'`,通过查找 `'World'` 的起始位置并截取其前一部分,然后拼接新的字符串完成替换[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值